{"id":71,"date":"2026-02-11T14:59:23","date_gmt":"2026-02-11T14:59:23","guid":{"rendered":"https:\/\/nafiz.ami.bd\/?page_id=71"},"modified":"2026-02-11T16:58:32","modified_gmt":"2026-02-11T16:58:32","slug":"71-2","status":"publish","type":"page","link":"https:\/\/nafiz.ami.bd\/index.php\/71-2\/","title":{"rendered":"Admin"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"71\" class=\"elementor elementor-71\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-141c98a e-flex e-con-boxed e-con e-parent\" data-id=\"141c98a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-308ce55 elementor-widget elementor-widget-html\" data-id=\"308ce55\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>System Admin - Soil Guard<\/title>\r\n    <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\r\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=JetBrains+Mono:wght@400;700&family=Inter:wght@300;400;600&display=swap\" rel=\"stylesheet\">\r\n    <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.0.0\/css\/all.min.css\">\r\n    <style>\r\n        body { font-family: 'Inter', sans-serif; background-color: #0f172a; color: #cbd5e1; height: 100vh; overflow: hidden; }\r\n        .mono { font-family: 'JetBrains Mono', monospace; }\r\n        \r\n        \/* Layout *\/\r\n        .admin-layout { display: grid; grid-template-columns: 260px 1fr; height: 100vh; }\r\n        .sidebar { background: #1e293b; border-right: 1px solid #334155; padding: 20px; display: flex; flex-direction: column; overflow-y: auto; }\r\n        .content { padding: 20px; overflow-y: auto; display: grid; grid-template-rows: auto 1fr; gap: 20px; }\r\n        \r\n        \/* Cards *\/\r\n        .stat-card { background: #1e293b; border: 1px solid #334155; border-radius: 12px; padding: 15px; transition: border-color 0.3s; }\r\n        .console-box { background: #000; border: 1px solid #334155; border-radius: 8px; font-family: 'JetBrains Mono', monospace; padding: 15px; color: #22c55e; overflow-y: auto; height: 100%; font-size: 0.85rem; }\r\n        \r\n        \/* Custom Scroll *\/\r\n        ::-webkit-scrollbar { width: 6px; }\r\n        ::-webkit-scrollbar-thumb { background: #475569; border-radius: 4px; }\r\n        \r\n        .blink { animation: blinker 1.5s linear infinite; }\r\n        @keyframes blinker { 50% { opacity: 0.3; } }\r\n        \r\n        .log-entry { margin-bottom: 4px; border-bottom: 1px solid #111; padding-bottom: 2px; }\r\n        .log-time { color: #64748b; margin-right: 10px; }\r\n        .log-ERROR { color: #ef4444; }\r\n        .log-INFO { color: #3b82f6; }\r\n        .log-AI { color: #a855f7; }\r\n        .log-SYSTEM { color: #eab308; }\r\n\r\n        \/* Device Status Box *\/\r\n        .device-box { background: rgba(15, 23, 42, 0.6); border: 1px solid #334155; padding: 10px; border-radius: 8px; margin-bottom: 5px; }\r\n        \r\n        \/* Live Indicator *\/\r\n        .live-dot { height: 8px; width: 8px; background-color: #22c55e; border-radius: 50%; display: inline-block; box-shadow: 0 0 5px #22c55e; }\r\n    <\/style>\r\n<\/head>\r\n<body>\r\n\r\n<div class=\"admin-layout\">\r\n    <!-- SIDEBAR -->\r\n    <div class=\"sidebar\">\r\n        <div class=\"flex items-center gap-3 mb-8 px-2\">\r\n            <i class=\"fas fa-shield-alt text-2xl text-red-500\"><\/i>\r\n            <div>\r\n                <h1 class=\"font-bold text-white tracking-wide\">ADMIN PANEL<\/h1>\r\n                <p class=\"text-[10px] text-slate-500 uppercase tracking-wider\">System v2.1<\/p>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <nav class=\"space-y-1 mb-6\">\r\n            <a href=\"\/\" class=\"flex items-center gap-3 px-4 py-3 rounded-lg text-slate-400 hover:bg-slate-800 hover:text-white transition group\">\r\n                <i class=\"fas fa-home w-5 text-slate-500 group-hover:text-blue-400\"><\/i> \r\n                <span class=\"text-sm font-medium\">User Dashboard<\/span>\r\n            <\/a>\r\n            <a href=\"#\" class=\"flex items-center gap-3 px-4 py-3 rounded-lg bg-blue-600 text-white shadow-lg shadow-blue-900\/20\">\r\n                <i class=\"fas fa-terminal w-5\"><\/i> \r\n                <span class=\"text-sm font-bold\">System Console<\/span>\r\n            <\/a>\r\n        <\/nav>\r\n\r\n        <!-- DEVICE MONITOR SECTION -->\r\n        <div class=\"mb-6\">\r\n            <h3 class=\"text-[10px] font-bold text-slate-500 uppercase mb-3 px-2 tracking-widest\">Connected Devices<\/h3>\r\n            \r\n            <!-- ESP32 Status -->\r\n            <div class=\"device-box flex items-center justify-between group cursor-help\" title=\"Main Controller\">\r\n                <div class=\"flex items-center gap-3\">\r\n                    <div class=\"w-8 h-8 rounded bg-slate-700 flex items-center justify-center\">\r\n                        <i class=\"fas fa-microchip text-blue-400\"><\/i>\r\n                    <\/div>\r\n                    <div>\r\n                        <p class=\"text-xs font-bold text-white\">ESP32 Main<\/p>\r\n                        <p id=\"esp-status-text\" class=\"text-[10px] text-slate-400\"><span id=\"esp-status-text\">Checking...<\/span><\/p>\r\n                    <\/div>\r\n                <\/div>\r\n                <span id=\"esp-led\" class=\"w-2 h-2 rounded-full bg-slate-600\"><\/span>\r\n            <\/div>\r\n\r\n            <!-- Sensors List with Values -->\r\n            <div class=\"space-y-1 pl-2 border-l border-slate-700 ml-4 mt-2\">\r\n                \r\n                <!-- Moisture -->\r\n                <div class=\"flex items-center justify-between p-2 rounded hover:bg-slate-800\/50 transition\">\r\n                    <div class=\"flex items-center gap-2 text-xs text-slate-400\">\r\n                        <i class=\"fas fa-tint text-[10px] text-blue-400 w-4\"><\/i> Moisture\r\n                    <\/div>\r\n                    <div class=\"flex items-center gap-2\">\r\n                        <span id=\"side-moisture\" class=\"text-[10px] font-mono text-blue-300\"><span class=\"agro-live-val\" data-type=\"moisture\">--<\/span><\/span>\r\n                        <i id=\"icon-moisture\" class=\"fas fa-circle text-[6px] text-slate-600\"><\/i>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- Air Temp -->\r\n                <div class=\"flex items-center justify-between p-2 rounded hover:bg-slate-800\/50 transition\">\r\n                    <div class=\"flex items-center gap-2 text-xs text-slate-400\">\r\n                        <i class=\"fas fa-thermometer-half text-[10px] text-orange-400 w-4\"><\/i> Air Temp\r\n                    <\/div>\r\n                    <div class=\"flex items-center gap-2\">\r\n                        <span id=\"side-temp\" class=\"text-[10px] font-mono text-orange-300\"><span class=\"agro-live-val\" data-type=\"temperature\">--<\/span><\/span>\r\n                        <i id=\"icon-temp\" class=\"fas fa-circle text-[6px] text-slate-600\"><\/i>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- Soil Temp (NEW) -->\r\n                <div class=\"flex items-center justify-between p-2 rounded hover:bg-slate-800\/50 transition\">\r\n                    <div class=\"flex items-center gap-2 text-xs text-slate-400\">\r\n                        <i class=\"fas fa-temperature-low text-[10px] text-red-400 w-4\"><\/i> Soil Temp\r\n                    <\/div>\r\n                    <div class=\"flex items-center gap-2\">\r\n                        <span id=\"side-soil-temp\" class=\"text-[10px] font-mono text-red-300\"><span class=\"agro-live-val\" data-type=\"soil_temp\">--<\/span><\/span>\r\n                        <i id=\"icon-soil-temp\" class=\"fas fa-circle text-[6px] text-slate-600\"><\/i>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- TDS -->\r\n                <div class=\"flex items-center justify-between p-2 rounded hover:bg-slate-800\/50 transition\">\r\n                    <div class=\"flex items-center gap-2 text-xs text-slate-400\">\r\n                        <i class=\"fas fa-flask text-[10px] text-purple-400 w-4\"><\/i> TDS\r\n                    <\/div>\r\n                    <div class=\"flex items-center gap-2\">\r\n                        <span id=\"side-tds\" class=\"text-[10px] font-mono text-purple-300\"><span class=\"agro-live-val\" data-type=\"tds\">--<\/span><\/span>\r\n                        <i id=\"icon-tds\" class=\"fas fa-circle text-[6px] text-slate-600\"><\/i>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- Humidity -->\r\n                <div class=\"flex items-center justify-between p-2 rounded hover:bg-slate-800\/50 transition\">\r\n                    <div class=\"flex items-center gap-2 text-xs text-slate-400\">\r\n                        <i class=\"fas fa-wind text-[10px] text-green-400 w-4\"><\/i> Air Hum\r\n                    <\/div>\r\n                    <div class=\"flex items-center gap-2\">\r\n                        <span id=\"side-humidity\" class=\"text-[10px] font-mono text-green-300\"><span class=\"agro-live-val\" data-type=\"humidity\">--<\/span><\/span>\r\n                        <i id=\"icon-humidity\" class=\"fas fa-circle text-[6px] text-slate-600\"><\/i>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- Light (NEW) -->\r\n                <div class=\"flex items-center justify-between p-2 rounded hover:bg-slate-800\/50 transition\">\r\n                    <div class=\"flex items-center gap-2 text-xs text-slate-400\">\r\n                        <i class=\"fas fa-sun text-[10px] text-yellow-400 w-4\"><\/i> Light\r\n                    <\/div>\r\n                    <div class=\"flex items-center gap-2\">\r\n                        <span id=\"side-light\" class=\"text-[10px] font-mono text-yellow-300\"><span class=\"agro-live-val\" data-type=\"light\">--<\/span><\/span>\r\n                        <i id=\"icon-light\" class=\"fas fa-circle text-[6px] text-slate-600\"><\/i>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Error Log Section -->\r\n        <div class=\"mt-auto\">\r\n            <h3 class=\"text-[10px] font-bold text-red-400 uppercase mb-3 px-2 tracking-widest flex items-center justify-between\">\r\n                Recent Errors <span id=\"err-count\" class=\"bg-red-500\/10 text-red-500 px-1.5 rounded text-[9px]\"><span id=\"err-count-agro\">0<\/span><\/span>\r\n            <\/h3>\r\n            <div id=\"error-list\" class=\"bg-slate-900 rounded-lg p-3 min-h-[100px] max-h-[150px] overflow-y-auto text-[11px] text-red-300 space-y-2 border border-red-900\/20 font-mono\">\r\n                <span class=\"text-slate-600 italic\"><div id=\"error-list-agro\">No errors detected.<\/div><\/span>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- MAIN CONTENT -->\r\n    <div class=\"content\">\r\n        <!-- TOP STATS -->\r\n        <div class=\"grid grid-cols-4 gap-4\">\r\n            <!-- CPU -->\r\n            <div class=\"stat-card\">\r\n                <div class=\"text-xs text-slate-400 uppercase mb-1\">System CPU<\/div>\r\n                <div class=\"flex justify-between items-end\">\r\n                    <span id=\"stat-cpu\" class=\"text-2xl font-bold text-white mono\"><span id=\"stat-cpu\">--%<\/span><\/span>\r\n                    <i class=\"fas fa-microchip text-slate-600\"><\/i>\r\n                <\/div>\r\n                <div class=\"w-full bg-slate-700 h-1 mt-2 rounded-full overflow-hidden\">\r\n                    <div id=\"bar-cpu\" class=\"bg-blue-500 h-full\" style=\"width: 0%\"><\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- RAM -->\r\n            <div class=\"stat-card\">\r\n                <div class=\"text-xs text-slate-400 uppercase mb-1\">RAM Usage<\/div>\r\n                <div class=\"flex justify-between items-end\">\r\n                    <span id=\"stat-ram\" class=\"text-2xl font-bold text-white mono\"><span id=\"stat-ram\">--%<\/span><\/span>\r\n                    <i class=\"fas fa-memory text-slate-600\"><\/i>\r\n                <\/div>\r\n                <div class=\"w-full bg-slate-700 h-1 mt-2 rounded-full overflow-hidden\">\r\n                    <div id=\"bar-ram\" class=\"bg-purple-500 h-full\" style=\"width: 0%\"><\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- INTERNET -->\r\n            <div class=\"stat-card\">\r\n                <div class=\"text-xs text-slate-400 uppercase mb-1\">Internet<\/div>\r\n                <div class=\"flex justify-between items-end\">\r\n                    <span id=\"stat-net\" class=\"text-xl font-bold text-white\"><span id=\"stat-net\">Checking...<\/span><\/span>\r\n                    <i class=\"fas fa-wifi text-slate-600\"><\/i>\r\n                <\/div>\r\n                <div class=\"flex items-center gap-2 mt-2 text-xs text-slate-500\">\r\n                    <span id=\"dot-net\" class=\"w-2 h-2 rounded-full bg-slate-500\"><\/span> Status\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- GEMINI API -->\r\n            <div class=\"stat-card border-l-4 border-l-blue-500 relative overflow-hidden\">\r\n                <div class=\"text-xs text-slate-400 uppercase mb-1 flex justify-between\">\r\n                    Gemini API <span class=\"live-dot blink\"><\/span>\r\n                <\/div>\r\n                <div class=\"flex flex-col\">\r\n                    <span id=\"stat-gemini\" class=\"text-xl font-bold text-blue-400\"><span id=\"stat-gemini\">Waiting<\/span><\/span>\r\n                    <div class=\"flex justify-between items-center mt-1\">\r\n                        <span id=\"gemini-update-time\" class=\"text-[10px] text-slate-500 font-mono\"><span id=\"gemini-update-time\">Syncing...<\/span><\/span>\r\n                        <span id=\"stat-latency\" class=\"text-xs mono bg-slate-800 px-2 py-1 rounded text-slate-300\"><span id=\"stat-latency\">0ms<\/span><\/span>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- CONSOLE TERMINAL -->\r\n        <div class=\"flex flex-col h-full overflow-hidden\">\r\n            <div class=\"flex justify-between items-center mb-2 px-1\">\r\n                <h3 class=\"text-xs font-bold text-slate-300 uppercase tracking-wider\"><i class=\"fas fa-code mr-2\"><\/i> Server Console Output<\/h3>\r\n                <span class=\"text-[10px] text-green-500 mono flex items-center gap-1\"><span class=\"live-dot blink\"><\/span> LIVE<\/span>\r\n            <\/div>\r\n            <div id=\"console-window\" class=\"console-box\">\r\n                <div class=\"log-entry\"><div id=\"console-window-agro\" style=\"line-height: 1.5;\">> Initializing Console...<\/div><\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<script>\r\n\/\/ --- Elementor to Plugin Connection Logic ---\r\nconst ajaxUrl = wp_agro.ajax_url;\r\n\r\nasync function updateLiveCharts() {\r\n    if(!isGuardLive) return;\r\n    try {\r\n        const res = await fetch(ajaxUrl + \"?action=get_agro_live_data\");\r\n        const json = await res.json();\r\n        if (json.success) {\r\n            const last = json.data;\r\n            const map = [\r\n                { k: 'moist', d: 'moisture', t: 'disp-moist', u: '%' },\r\n                { k: 'soil', d: 'soil_temp', t: 'disp-soil', u: '\u00b0C' },\r\n                { k: 'tds', d: 'tds', t: 'disp-tds', u: '' },\r\n                { k: 'light', d: 'light', t: 'disp-light', u: '' },\r\n                { k: 'temp', d: 'temperature', t: 'disp-temp', u: '\u00b0C' },\r\n                { k: 'hum', d: 'humidity', t: 'disp-hum', u: '%' }\r\n            ];\r\n            map.forEach(m => {\r\n                \/\/ Charts update (\u09a4\u09cb\u09b0 \u0986\u0997\u09c7\u09b0 \u09b2\u099c\u09bf\u0995 \u0985\u09a8\u09c1\u09af\u09be\u09df\u09c0)\r\n                if(charts[m.k]) {\r\n                    document.getElementById(m.t).innerText = last[m.d] + m.u;\r\n                }\r\n            });\r\n        }\r\n    } catch(e) { console.log(\"Sensor sync error\"); }\r\n}\r\n\r\nasync function performDeepAIScan() {\r\n    if(!isGuardLive || !toggleState) return;\r\n    try {\r\n        const formData = new FormData();\r\n        formData.append('action', 'agro_ai_analysis');\r\n        formData.append('plant', activePlant);\r\n\r\n        const res = await fetch(ajaxUrl, { method: 'POST', body: formData });\r\n        const data = await res.json();\r\n        \r\n        \/\/ \u099c\u09c7\u09ae\u09bf\u09a8\u09bf \u098f\u0986\u0987-\u098f\u09b0 \u09a1\u09c7\u099f\u09be \u09a6\u09bf\u09df\u09c7 \u0987\u0989\u0986\u0987 \u0986\u09aa\u09a1\u09c7\u099f (Rating, Needle, Intel)\r\n        const rating = parseFloat(data.rating) || 0;\r\n        document.getElementById('ai-health-val').innerText = (rating * 10).toFixed(0) + '%';\r\n        document.getElementById('ai-health-bar').style.width = (rating * 10) + '%';\r\n        document.getElementById('risk-needle').style.transform = `rotate(${90 - (rating * 18)}deg)`;\r\n        document.getElementById('risk-status-text').innerText = data.condition;\r\n        \r\n        logAnalysisEvent(`Expert Diagnosis: ${data.analysis_bn}`);\r\n    } catch(e) { console.error(\"AI connection lost\"); }\r\n}\r\n\r\n**\u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u09ab\u09be\u0987\u09b2\u099f\u09be \u0986\u09aa\u09a1\u09c7\u099f \u0995\u09b0\u09c7 \u09a8\u09bf\u09b8, \u0986\u09b0 \u098f\u09b2\u09bf\u09ae\u09c7\u09a8\u09cd\u099f\u09b0\u09c7\u09b0 \u09ad\u09c7\u09a4\u09b0 \u0987\u0989\u0986\u09b0\u098f\u09b2\u0997\u09c1\u09b2\u09cb (fetch) \u098f\u09ad\u09be\u09ac\u09c7 \u09aa\u09be\u09b2\u09cd\u099f\u09c7 \u09a6\u09bf\u09b2\u09c7\u0987 \u0995\u09c7\u09b2\u09cd\u09b2\u09be\u09ab\u09a4\u09c7!** \u0995\u09cb\u09a8\u09cb \u0995\u09a8\u09ab\u09bf\u0989\u09b6\u09a8 \u09a5\u09be\u0995\u09b2\u09c7 \u09ac\u09b2\u09bf\u09b8\u0964 \ud83d\ude0e\ud83e\udd1c\ud83e\udd1b\r\n    const consoleBox = document.getElementById('console-window');\r\n\r\n    \/\/ Helper: Convert 24h to 12h AM\/PM\r\n    const to12h = (timeStr) => {\r\n        if(!timeStr) return '';\r\n        if(timeStr.includes('M')) return timeStr; \r\n        let [h, m, s] = timeStr.split(':');\r\n        h = parseInt(h);\r\n        const ampm = h >= 12 ? 'PM' : 'AM';\r\n        h = h % 12 || 12;\r\n        return `${h}:${m}:${s} ${ampm}`;\r\n    };\r\n\r\n    async function updateAdminStats() {\r\n        try {\r\n            const response = await fetch('\/api\/admin\/stats?t=' + new Date().getTime());\r\n            const data = await response.json();\r\n\r\n            \/\/ 1. Hardware Stats\r\n            document.getElementById('stat-cpu').innerText = data.cpu + '%';\r\n            document.getElementById('bar-cpu').style.width = data.cpu + '%';\r\n            document.getElementById('stat-ram').innerText = data.ram + '%';\r\n            document.getElementById('bar-ram').style.width = data.ram + '%';\r\n\r\n            \/\/ 2. Internet\r\n            const netEl = document.getElementById('stat-net');\r\n            const netDot = document.getElementById('dot-net');\r\n            netEl.innerText = data.internet;\r\n            if(data.internet === 'Connected') {\r\n                netEl.className = \"text-xl font-bold text-green-400\";\r\n                netDot.className = \"w-2 h-2 rounded-full bg-green-500 shadow-[0_0_5px_#22c55e]\";\r\n            } else {\r\n                netEl.className = \"text-xl font-bold text-red-400\";\r\n                netDot.className = \"w-2 h-2 rounded-full bg-red-500\";\r\n            }\r\n\r\n            \/\/ 3. Gemini API\r\n            const geminiEl = document.getElementById('stat-gemini');\r\n            geminiEl.innerText = data.gemini.status;\r\n            document.getElementById('stat-latency').innerText = data.gemini.latency + 'ms';\r\n            \r\n            const now = new Date();\r\n            document.getElementById('gemini-update-time').innerText = \"Last: \" + now.toLocaleTimeString('en-US', {hour12: true});\r\n\r\n            geminiEl.className = (data.gemini.status === \"Offline\" || data.gemini.status === \"Error\") \r\n                ? \"text-xl font-bold text-red-500\" \r\n                : \"text-xl font-bold text-blue-400\";\r\n\r\n            \/\/ 4. Logs\r\n            const logHTML = data.logs.reverse().map(log => {\r\n                return `<div class=\"log-entry\">\r\n                            <span class=\"log-time\">[${to12h(log.time)}]<\/span>\r\n                            <span class=\"log-${log.type}\">${log.type}:<\/span> ${log.msg}\r\n                        <\/div>`;\r\n            }).join('');\r\n            if(consoleBox.innerHTML !== logHTML) {\r\n                consoleBox.innerHTML = logHTML;\r\n                consoleBox.scrollTop = consoleBox.scrollHeight;\r\n            }\r\n\r\n            \/\/ 5. Errors\r\n            document.getElementById('err-count').innerText = data.errors.length;\r\n            if(data.errors.length > 0) {\r\n                const errHTML = data.errors.map(err => {\r\n                    return `<div class=\"border-b border-red-900\/30 pb-1 mb-1\">\r\n                                <div class=\"text-[9px] text-slate-500\">${to12h(err.time)}<\/div>\r\n                                <div>${err.msg}<\/div>\r\n                            <\/div>`;\r\n                }).join('');\r\n                document.getElementById('error-list').innerHTML = errHTML;\r\n            }\r\n\r\n            \/\/ 6. Device Monitor (Updated with Soil Temp & Light)\r\n            const sensors = data.sensors;\r\n            const isEspOnline = sensors.timestamp !== \"Not started\";\r\n            \r\n            const espLed = document.getElementById('esp-led');\r\n            const espText = document.getElementById('esp-status-text');\r\n            if(isEspOnline) {\r\n                espLed.className = \"w-2 h-2 rounded-full bg-green-500 shadow-[0_0_8px_#22c55e]\";\r\n                espText.innerText = \"Online\";\r\n                espText.className = \"text-[10px] text-green-400 font-bold\";\r\n            } else {\r\n                espLed.className = \"w-2 h-2 rounded-full bg-red-500\";\r\n                espText.innerText = \"Offline\";\r\n                espText.className = \"text-[10px] text-red-400\";\r\n            }\r\n\r\n            const updateSensorIcon = (id, val) => {\r\n                const el = document.getElementById(id);\r\n                if(val > 0) el.className = \"fas fa-check-circle text-green-500 text-[8px]\";\r\n                else el.className = \"fas fa-times-circle text-red-500 text-[8px]\";\r\n            };\r\n\r\n            \/\/ Values Update\r\n            document.getElementById('side-moisture').innerText = sensors.moisture + '%';\r\n            document.getElementById('side-temp').innerText = sensors.temperature + '\u00b0C';\r\n            document.getElementById('side-soil-temp').innerText = (sensors.soil_temp || 0) + '\u00b0C';\r\n            document.getElementById('side-tds').innerText = sensors.tds + 'ppm';\r\n            document.getElementById('side-humidity').innerText = sensors.humidity + '%';\r\n            document.getElementById('side-light').innerText = (sensors.light || 0);\r\n\r\n            \/\/ Icons Update\r\n            updateSensorIcon('icon-moisture', sensors.moisture);\r\n            updateSensorIcon('icon-temp', sensors.temperature);\r\n            updateSensorIcon('icon-soil-temp', sensors.soil_temp);\r\n            updateSensorIcon('icon-tds', sensors.tds);\r\n            updateSensorIcon('icon-humidity', sensors.humidity);\r\n            updateSensorIcon('icon-light', sensors.light);\r\n\r\n        } catch (err) {\r\n            console.error(\"Admin poll failed\", err);\r\n        }\r\n    }\r\n\r\n    setInterval(updateAdminStats, 3000);\r\n    updateAdminStats();\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>System Admin &#8211; Soil Guard ADMIN PANEL System v2.1 User Dashboard System Console Connected Devices ESP32 Main Moisture Air Temp Soil Temp TDS Air Hum Light Recent Errors System CPU RAM Usage Internet Status Gemini API Server Console Output LIVE<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-71","page","type-page","status-publish","hentry"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/nafiz.ami.bd\/index.php\/wp-json\/wp\/v2\/pages\/71","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nafiz.ami.bd\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/nafiz.ami.bd\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/nafiz.ami.bd\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nafiz.ami.bd\/index.php\/wp-json\/wp\/v2\/comments?post=71"}],"version-history":[{"count":40,"href":"https:\/\/nafiz.ami.bd\/index.php\/wp-json\/wp\/v2\/pages\/71\/revisions"}],"predecessor-version":[{"id":137,"href":"https:\/\/nafiz.ami.bd\/index.php\/wp-json\/wp\/v2\/pages\/71\/revisions\/137"}],"wp:attachment":[{"href":"https:\/\/nafiz.ami.bd\/index.php\/wp-json\/wp\/v2\/media?parent=71"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}