{"product_id":"smart-prepaid-energy-meter-esp32-electricity-monitor-automated-control","title":"Smart Prepaid Energy Meter – ESP32 Electricity Monitor \u0026 Automated Control","description":"\u003ch3 style=\"text-align: right;\"\u003eالعداد الذكي مسبق الدفع – تحكم كامل بالكهرباء بلمسة زر!\u003c\/h3\u003e\n\u003cp style=\"text-align: right;\"\u003eاحصل على السيطرة الكاملة على استهلاك الطاقة مع \u003cb\u003eنظام العداد الذكي مسبق الدفع\u003c\/b\u003e. تم تصميم الجهاز باستخدام تقنيات إنترنت الأشياء (IoT) لتوفير مراقبة لحظية وإدارة متكاملة للتغذية الكهربائية والحد من الهدر، وذلك عبر واجهة تحكم لاسلكية سهلة السلسة.\u003c\/p\u003e\n\u003ch4 style=\"text-align: right;\"\u003e\u003cb\u003eأبرز المميزات:\u003c\/b\u003e\u003c\/h4\u003e\n\u003cul\u003e\n\u003cli style=\"text-align: right;\"\u003e\n\u003cp\u003e📊 \u003cb\u003eمراقبة لحظية ومباشرة:\u003c\/b\u003e عرض الفولتية (V)، التيار (A)، والقدرة (W) بشكل حيوك ولحظي على هاتفك.\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli style=\"text-align: right;\"\u003e\n\u003cp\u003e💳 \u003cb\u003eتعبئة رصيد مسبقة الدفع:\u003c\/b\u003e إمكانية شحن الطاقة بالكيلوواط\/ساعة (kWh) بسهولة عن طريق إدخال أكواد الشحن المخصصة.\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli style=\"text-align: right;\"\u003e\n\u003cp\u003e🔌 \u003cb\u003eفصل وتوصيل تلقائي:\u003c\/b\u003e مزود بريلاي ذكي يفصل الكهرباء أوتوماتيكياً فور نفاد الرصيد ويعيدها فوراً عند الشحن.\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli style=\"text-align: right;\"\u003e\n\u003cp\u003e📱 \u003cb\u003eيعمل بدون تطبيقات:\u003c\/b\u003e لا يحتاج لتنزيل أي تطبيق، فقط اتصل بالشبكة وافتح المتصفح للوصول إلى لوحة التحكم.\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp style=\"text-align: right;\"\u003e📈 \u003cb\u003eمؤشر استهلاك تفاعلي:\u003c\/b\u003e شريط تقدم يوضح نسبة الطاقة المستهلكة والمتبقية لتتبع الميزانية بوضوح.\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003ch4\u003e\u003cb\u003eالمواصفات الفنية:\u003c\/b\u003e\u003c\/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cb\u003eجهد التشغيل:\u003c\/b\u003e 220V AC\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cb\u003eالمتحكم الرئيسي:\u003c\/b\u003e ESP32 مزود بشبكة Wi-Fi مدمجة\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cb\u003eمستشعر الطاقة:\u003c\/b\u003e PZEM-004T عالي الدقة\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cb\u003eالخرج:\u003c\/b\u003e ريلاي تحكم عالي الجودة\u003c\/p\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003ch3\u003e⚡ Smart Prepaid Energy Meter – Total Power Control at Your Fingertips!\u003c\/h3\u003e\n\u003cp\u003eTake full control of your electricity consumption with our \u003cb\u003eSmart Prepaid Energy Meter System\u003c\/b\u003e. Designed for efficiency and real-time monitoring, this IoT device allows you to manage power distribution, track usage, and prevent energy waste effortlessly through an intuitive web interface.\u003c\/p\u003e\n\u003ch4\u003e\u003cb\u003eKey Features:\u003c\/b\u003e\u003c\/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e📊 \u003cb\u003eReal-Time Power Monitoring:\u003c\/b\u003e Track live Voltage (V), Current (A), and Active Power (W) instantly from any smart device.\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003e💳 \u003cb\u003ePrepaid Code Recharge System:\u003c\/b\u003e Recharge energy capacity (kWh) quickly using secure prepaid recharge codes.\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003e🔌 \u003cb\u003eAutomated Load Disconnect:\u003c\/b\u003e Features an integrated smart relay that automatically cuts off power when credit reaches zero and restores it immediately upon recharge.\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003e📱 \u003cb\u003eNo App Required:\u003c\/b\u003e Connects directly via Wi-Fi. Access the control dashboard instantly using any web browser.\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003e📈 \u003cb\u003eInteractive Progress Bar:\u003c\/b\u003e Visual indicator showing consumed vs. remaining energy for seamless budget tracking.\u003c\/p\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch4\u003e\u003cb\u003eTechnical Specifications:\u003c\/b\u003e\u003c\/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cb\u003eOperating Voltage:\u003c\/b\u003e 220V AC\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cb\u003eMicrocontroller:\u003c\/b\u003e ESP32 with built-in Wi-Fi AP\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cb\u003eEnergy Sensor:\u003c\/b\u003e High-precision PZEM-004T module\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cb\u003eRelay Output:\u003c\/b\u003e High-capacity control relay\u003cstrong\u003e\u003c\/strong\u003e\u003c\/p\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp style=\"text-align: right;\"\u003e:الكود \u003cstrong\u003eالبرمجي\u003c\/strong\u003e\u003c\/p\u003e\n\u003cdiv\u003e\n\u003cdiv\u003e\n\u003cspan\u003e#include\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003e\u0026lt;WiFi.h\u0026gt;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e#include\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003e\u0026lt;WebServer.h\u0026gt;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e#include\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003e\u0026lt;PZEM004Tv30.h\u0026gt;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e\/\/ --- إعدادات المنافذ ---\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e#define\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eRELAY_PIN\u003c\/span\u003e\u003cspan\u003e    \u003c\/span\u003e\u003cspan\u003e23\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e#define\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003ePZEM_RX_PIN\u003c\/span\u003e\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003e16\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e#define\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003ePZEM_TX_PIN\u003c\/span\u003e\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003e17\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e\/\/ --- إعدادات الواي فاي ---\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003econst\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003echar\u003c\/span\u003e\u003cspan\u003e* ssid     = \u003c\/span\u003e\u003cspan\u003e\"Smart-Energy-Meter\"\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003econst\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003echar\u003c\/span\u003e\u003cspan\u003e* password = \u003c\/span\u003e\u003cspan\u003e\"password123\"\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003eWebServer \u003c\/span\u003e\u003cspan\u003eserver\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e80\u003c\/span\u003e\u003cspan\u003e);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003eHardwareSerial \u003c\/span\u003e\u003cspan\u003epzemSerial\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e2\u003c\/span\u003e\u003cspan\u003e);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003ePZEM004Tv30 \u003c\/span\u003e\u003cspan\u003epzem\u003c\/span\u003e\u003cspan\u003e(pzemSerial, PZEM_RX_PIN, PZEM_TX_PIN);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e\/\/ --- المتغيرات الرئيسية ---\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003efloat\u003c\/span\u003e\u003cspan\u003e remainingEnergy = \u003c\/span\u003e\u003cspan\u003e0.0\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003efloat\u003c\/span\u003e\u003cspan\u003e totalCapacity   = \u003c\/span\u003e\u003cspan\u003e0.0\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003efloat\u003c\/span\u003e\u003cspan\u003e consumedEnergy  = \u003c\/span\u003e\u003cspan\u003e0.0\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003efloat\u003c\/span\u003e\u003cspan\u003e voltage = \u003c\/span\u003e\u003cspan\u003e0.0\u003c\/span\u003e\u003cspan\u003e, current = \u003c\/span\u003e\u003cspan\u003e0.0\u003c\/span\u003e\u003cspan\u003e, power = \u003c\/span\u003e\u003cspan\u003e0.0\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003eunsigned\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003elong\u003c\/span\u003e\u003cspan\u003e lastUpdateTime = \u003c\/span\u003e\u003cspan\u003e0\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003ebool\u003c\/span\u003e\u003cspan\u003e currentRelayState = \u003c\/span\u003e\u003cspan\u003efalse\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e\/\/ --- دالة التحكم الذكي بالريلاي (تعتمد العزل التام للـ 3.3V) ---\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003evoid\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003esetRelayState\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003ebool\u003c\/span\u003e\u003cspan\u003e turnOn) {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e  currentRelayState = turnOn;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003eif\u003c\/span\u003e\u003cspan\u003e (turnOn) {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    \u003c\/span\u003e\u003cspan\u003epinMode\u003c\/span\u003e\u003cspan\u003e(RELAY_PIN, OUTPUT);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    \u003c\/span\u003e\u003cspan\u003edigitalWrite\u003c\/span\u003e\u003cspan\u003e(RELAY_PIN, LOW);\u003c\/span\u003e\u003cspan\u003e  \/\/ سحب الإشارة للـ GND (تشغيل)\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  } \u003c\/span\u003e\u003cspan\u003eelse\u003c\/span\u003e\u003cspan\u003e {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    \u003c\/span\u003e\u003cspan\u003epinMode\u003c\/span\u003e\u003cspan\u003e(RELAY_PIN, INPUT);\u003c\/span\u003e\u003cspan\u003e     \/\/ عزل المنفذ تماماً لمنع تسريب الـ 1.7V (إطفاء قطعي)\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e  }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e}\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e\/\/ --- واجهة الموقع ---\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003evoid\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003ehandleRoot\u003c\/span\u003e\u003cspan\u003e() {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  String html = \u003c\/span\u003e\u003cspan\u003eR\"rawliteral(\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u0026lt;!DOCTYPE html\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u0026lt;html lang=\"ar\" dir=\"rtl\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u0026lt;head\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e    \u0026lt;meta charset=\"UTF-8\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e    \u0026lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e    \u0026lt;title\u0026gt;منظومة الطاقة - وضع الفحص\u0026lt;\/title\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e    \u0026lt;style\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        :root {\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            --bg-color: #0f172a; --card-bg: #1e293b; --accent-green: #10b981;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            --accent-blue: #3b82f6; --accent-red: #ef4444; --accent-amber: #f59e0b;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            --text-main: #f8fafc; --text-sub: #94a3b8;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        * { box-sizing: border-box; margin: 0; padding: 0; font-family: 'Segoe UI', sans-serif; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        body { background-color: var(--bg-color); color: var(--text-main); padding: 20px; display: flex; justify-content: center; align-items: center; min-height: 100vh; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .container { width: 100%; max-width: 480px; display: flex; flex-direction: column; gap: 20px; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .header { text-align: center; padding: 10px 0; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .header h1 { font-size: 1.6rem; color: var(--text-main); }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .card { background: var(--card-bg); border-radius: 16px; padding: 20px; border: 1px solid rgba(255,255,255,0.05); box-shadow: 0 10px 25px rgba(0,0,0,0.3); }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .balance-box { text-align: center; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .balance-title { font-size: 0.9rem; color: var(--text-sub); margin-bottom: 8px; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .balance-value { font-size: 2.2rem; font-weight: 800; color: var(--accent-amber); }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .balance-unit { font-size: 1rem; color: var(--text-sub); }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .usage-section { margin-top: 15px; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .usage-header { display: flex; justify-content: space-between; font-size: 0.85rem; color: var(--text-sub); margin-bottom: 6px; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .progress-bar-bg { width: 100%; height: 12px; background: #334155; border-radius: 6px; overflow: hidden; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .progress-bar-fill { height: 100%; width: 0%; background: linear-gradient(90deg, var(--accent-green), var(--accent-amber), var(--accent-red)); transition: width 0.5s ease; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .metrics-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 10px; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .metric-card { background: rgba(15, 23, 42, 0.6); padding: 12px 8px; border-radius: 12px; text-align: center; border: 1px solid rgba(255,255,255,0.03); }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .metric-value { font-size: 1.1rem; font-weight: 700; margin-top: 4px; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .metric-label { font-size: 0.75rem; color: var(--text-sub); }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .status-badge { width: 100%; padding: 14px; border-radius: 12px; font-size: 1.1rem; font-weight: 700; text-align: center; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .status-badge.on { background: rgba(16, 185, 129, 0.15); color: var(--accent-green); border: 1px solid var(--accent-green); }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .status-badge.off { background: rgba(239, 68, 68, 0.15); color: var(--accent-red); border: 1px solid var(--accent-red); }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .recharge-box h3 { font-size: 1rem; margin-bottom: 12px; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .input-group { display: flex; gap: 8px; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .code-input { flex: 1; padding: 12px; border-radius: 10px; border: 1px solid #475569; background: #0f172a; color: #fff; font-size: 1rem; text-align: center; letter-spacing: 2px; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .submit-btn { padding: 12px 20px; border-radius: 10px; border: none; background: var(--accent-blue); color: white; font-weight: 600; cursor: pointer; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .code-hint { font-size: 0.75rem; color: var(--text-sub); margin-top: 10px; line-height: 1.5; background: rgba(255,255,255,0.02); padding: 8px; border-radius: 8px; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        .badge { background: #334155; padding: 2px 6px; border-radius: 4px; color: var(--accent-amber); font-weight: bold; }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e    \u0026lt;\/style\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u0026lt;\/head\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u0026lt;body\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e    \u0026lt;div class=\"container\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        \u0026lt;div class=\"header\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            \u0026lt;h1\u0026gt;⚡ منظومة التغذية التلقائية\u0026lt;\/h1\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e        \u0026lt;div class=\"card\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            \u0026lt;div class=\"balance-box\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;div class=\"balance-title\"\u0026gt;الرصيد المتبقي\u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;div class=\"balance-value\" id=\"remEnergy\"\u0026gt;0.00000 \u0026lt;span class=\"balance-unit\"\u0026gt;kWh\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e            \u0026lt;div class=\"usage-section\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;div class=\"usage-header\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                    \u0026lt;span\u0026gt;مستوى الاستهلاك المتراكم\u0026lt;\/span\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                    \u0026lt;span id=\"usagePercent\"\u0026gt;0%\u0026lt;\/span\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;div class=\"progress-bar-bg\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                    \u0026lt;div class=\"progress-bar-fill\" id=\"progressFill\"\u0026gt;\u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e        \u0026lt;div class=\"status-badge off\" id=\"statusBadge\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            🔴 التغذية متوقفة (أدخل كود للشحن)\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e        \u0026lt;div class=\"card\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            \u0026lt;div class=\"metrics-grid\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;div class=\"metric-card\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                    \u0026lt;div class=\"metric-label\"\u0026gt;الفولتية\u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                    \u0026lt;div class=\"metric-value\" id=\"valVolts\"\u0026gt;0 V\u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;div class=\"metric-card\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                    \u0026lt;div class=\"metric-label\"\u0026gt;التيار\u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                    \u0026lt;div class=\"metric-value\" id=\"valAmps\"\u0026gt;0.0 A\u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;div class=\"metric-card\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                    \u0026lt;div class=\"metric-label\"\u0026gt;القدرة\u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                    \u0026lt;div class=\"metric-value\" id=\"valWatts\"\u0026gt;0 W\u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e        \u0026lt;div class=\"card recharge-box\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            \u0026lt;h3\u0026gt;💳 تعبئة كارت الفحص\u0026lt;\/h3\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            \u0026lt;div class=\"input-group\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;input type=\"number\" id=\"rechargeCode\" class=\"code-input\" placeholder=\"أدخل الكود\" maxlength=\"4\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                \u0026lt;button class=\"submit-btn\" onclick=\"submitCode()\"\u0026gt;تأكيد\u0026lt;\/button\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            \u0026lt;div class=\"code-hint\"\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                📌 \u0026lt;b\u0026gt;أكواد الفحص السريع (لحمل 26W):\u0026lt;\/b\u0026gt;\u0026lt;br\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                • \u0026lt;span class=\"badge\"\u0026gt;1010\u0026lt;\/span\u0026gt; : تشغيل لمدة \u0026lt;b\u0026gt;دقيقة واحدة\u0026lt;\/b\u0026gt;\u0026lt;br\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                • \u0026lt;span class=\"badge\"\u0026gt;2020\u0026lt;\/span\u0026gt; : تشغيل لمدة \u0026lt;b\u0026gt;دقيقتين\u0026lt;\/b\u0026gt;\u0026lt;br\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                • \u0026lt;span class=\"badge\"\u0026gt;3020\u0026lt;\/span\u0026gt; : تشغيل لمدة \u0026lt;b\u0026gt;3 دقائق\u0026lt;\/b\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e    \u0026lt;\/div\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e    \u0026lt;script\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        setInterval(fetchData, 1000);\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        function fetchData() {\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            fetch('\/data').then(res =\u0026gt; res.json()).then(data =\u0026gt; {\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                document.getElementById('remEnergy').innerText = data.remEnergy.toFixed(5) + \" kWh\";\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                document.getElementById('valVolts').innerText = data.voltage.toFixed(1) + \" V\";\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                document.getElementById('valAmps').innerText = data.current.toFixed(2) + \" A\";\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                document.getElementById('valWatts').innerText = data.power.toFixed(0) + \" W\";\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e                let percent = data.totalCap \u0026gt; 0 ? ((data.consumed \/ data.totalCap) * 100) : 0;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                if(percent \u0026gt; 100) percent = 100;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                document.getElementById('progressFill').style.width = percent.toFixed(1) + \"%\";\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                document.getElementById('usagePercent').innerText = percent.toFixed(1) + \"%\";\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e                let badge = document.getElementById('statusBadge');\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                if (data.relayState) {\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                    badge.className = \"status-badge on\";\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                    badge.innerHTML = \"🟢 التغذية شغالـة (جاري الاستهلاك)\";\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                } else {\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                    badge.className = \"status-badge off\";\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                    badge.innerHTML = \"🔴 التغذية متوقفة (انتهى الرصيد)\";\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            });\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        }\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e        function submitCode() {\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            let code = document.getElementById('rechargeCode').value;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            if(!code) return alert(\"أدخل الكود أولاً!\");\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            fetch('\/recharge?code=' + code, { method: 'POST' }).then(res =\u0026gt; res.text()).then(msg =\u0026gt; {\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                alert(msg);\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e                document.getElementById('rechargeCode').value = '';\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e            });\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e    \u0026lt;\/script\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u0026lt;\/body\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u0026lt;\/html\u0026gt;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  )rawliteral\"\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003eserver\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003esend\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e200\u003c\/span\u003e\u003cspan\u003e, \u003c\/span\u003e\u003cspan\u003e\"text\/html\"\u003c\/span\u003e\u003cspan\u003e, html);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e}\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003evoid\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003ehandleData\u003c\/span\u003e\u003cspan\u003e() {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  String json = \u003c\/span\u003e\u003cspan\u003e\"{\"\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  json += \u003c\/span\u003e\u003cspan\u003e\"\\\"remEnergy\\\":\"\u003c\/span\u003e\u003cspan\u003e + \u003c\/span\u003e\u003cspan\u003eString\u003c\/span\u003e\u003cspan\u003e(remainingEnergy, \u003c\/span\u003e\u003cspan\u003e5\u003c\/span\u003e\u003cspan\u003e) + \u003c\/span\u003e\u003cspan\u003e\",\"\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  json += \u003c\/span\u003e\u003cspan\u003e\"\\\"totalCap\\\":\"\u003c\/span\u003e\u003cspan\u003e + \u003c\/span\u003e\u003cspan\u003eString\u003c\/span\u003e\u003cspan\u003e(totalCapacity, \u003c\/span\u003e\u003cspan\u003e5\u003c\/span\u003e\u003cspan\u003e) + \u003c\/span\u003e\u003cspan\u003e\",\"\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  json += \u003c\/span\u003e\u003cspan\u003e\"\\\"consumed\\\":\"\u003c\/span\u003e\u003cspan\u003e + \u003c\/span\u003e\u003cspan\u003eString\u003c\/span\u003e\u003cspan\u003e(consumedEnergy, \u003c\/span\u003e\u003cspan\u003e5\u003c\/span\u003e\u003cspan\u003e) + \u003c\/span\u003e\u003cspan\u003e\",\"\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  json += \u003c\/span\u003e\u003cspan\u003e\"\\\"voltage\\\":\"\u003c\/span\u003e\u003cspan\u003e + \u003c\/span\u003e\u003cspan\u003eString\u003c\/span\u003e\u003cspan\u003e(voltage, \u003c\/span\u003e\u003cspan\u003e1\u003c\/span\u003e\u003cspan\u003e) + \u003c\/span\u003e\u003cspan\u003e\",\"\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  json += \u003c\/span\u003e\u003cspan\u003e\"\\\"current\\\":\"\u003c\/span\u003e\u003cspan\u003e + \u003c\/span\u003e\u003cspan\u003eString\u003c\/span\u003e\u003cspan\u003e(current, \u003c\/span\u003e\u003cspan\u003e2\u003c\/span\u003e\u003cspan\u003e) + \u003c\/span\u003e\u003cspan\u003e\",\"\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  json += \u003c\/span\u003e\u003cspan\u003e\"\\\"power\\\":\"\u003c\/span\u003e\u003cspan\u003e + \u003c\/span\u003e\u003cspan\u003eString\u003c\/span\u003e\u003cspan\u003e(power, \u003c\/span\u003e\u003cspan\u003e1\u003c\/span\u003e\u003cspan\u003e) + \u003c\/span\u003e\u003cspan\u003e\",\"\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  json += \u003c\/span\u003e\u003cspan\u003e\"\\\"relayState\\\":\"\u003c\/span\u003e\u003cspan\u003e + \u003c\/span\u003e\u003cspan\u003eString\u003c\/span\u003e\u003cspan\u003e(currentRelayState ? \u003c\/span\u003e\u003cspan\u003e\"true\"\u003c\/span\u003e\u003cspan\u003e : \u003c\/span\u003e\u003cspan\u003e\"false\"\u003c\/span\u003e\u003cspan\u003e);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  json += \u003c\/span\u003e\u003cspan\u003e\"}\"\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003eserver\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003esend\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e200\u003c\/span\u003e\u003cspan\u003e, \u003c\/span\u003e\u003cspan\u003e\"application\/json\"\u003c\/span\u003e\u003cspan\u003e, json);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e}\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003evoid\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003ehandleRecharge\u003c\/span\u003e\u003cspan\u003e() {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003eif\u003c\/span\u003e\u003cspan\u003e (\u003c\/span\u003e\u003cspan\u003eserver\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003ehasArg\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e\"code\"\u003c\/span\u003e\u003cspan\u003e)) {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    String code = \u003c\/span\u003e\u003cspan\u003eserver\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003earg\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e\"code\"\u003c\/span\u003e\u003cspan\u003e);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    \u003c\/span\u003e\u003cspan\u003efloat\u003c\/span\u003e\u003cspan\u003e addEnergy = \u003c\/span\u003e\u003cspan\u003e0.0\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    \u003c\/span\u003e\u003cspan\u003eif\u003c\/span\u003e\u003cspan\u003e (code == \u003c\/span\u003e\u003cspan\u003e\"1010\"\u003c\/span\u003e\u003cspan\u003e)      addEnergy = \u003c\/span\u003e\u003cspan\u003e0.000433\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\u003cspan\u003e \/\/ 1 دقيقة\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    \u003c\/span\u003e\u003cspan\u003eelse\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eif\u003c\/span\u003e\u003cspan\u003e (code == \u003c\/span\u003e\u003cspan\u003e\"2020\"\u003c\/span\u003e\u003cspan\u003e) addEnergy = \u003c\/span\u003e\u003cspan\u003e0.000867\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\u003cspan\u003e \/\/ 2 دقيقة\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    \u003c\/span\u003e\u003cspan\u003eelse\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eif\u003c\/span\u003e\u003cspan\u003e (code == \u003c\/span\u003e\u003cspan\u003e\"3020\"\u003c\/span\u003e\u003cspan\u003e) addEnergy = \u003c\/span\u003e\u003cspan\u003e0.001300\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\u003cspan\u003e \/\/ 3 دقائق\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    \u003c\/span\u003e\u003cspan\u003eif\u003c\/span\u003e\u003cspan\u003e (addEnergy \u0026gt; \u003c\/span\u003e\u003cspan\u003e0\u003c\/span\u003e\u003cspan\u003e) {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e      remainingEnergy += addEnergy;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e      totalCapacity += addEnergy;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e      \u003c\/span\u003e\u003cspan\u003eserver\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003esend\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e200\u003c\/span\u003e\u003cspan\u003e, \u003c\/span\u003e\u003cspan\u003e\"text\/plain\"\u003c\/span\u003e\u003cspan\u003e, \u003c\/span\u003e\u003cspan\u003e\"تم التفعيل بنجاح! الرصيد كافٍ للفحص.\"\u003c\/span\u003e\u003cspan\u003e);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    } \u003c\/span\u003e\u003cspan\u003eelse\u003c\/span\u003e\u003cspan\u003e {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e      \u003c\/span\u003e\u003cspan\u003eserver\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003esend\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e400\u003c\/span\u003e\u003cspan\u003e, \u003c\/span\u003e\u003cspan\u003e\"text\/plain\"\u003c\/span\u003e\u003cspan\u003e, \u003c\/span\u003e\u003cspan\u003e\"⚠️ كود غير صحيح!\"\u003c\/span\u003e\u003cspan\u003e);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e    }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e  }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e}\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003evoid\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003esetup\u003c\/span\u003e\u003cspan\u003e() {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003eSerial\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003ebegin\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e115200\u003c\/span\u003e\u003cspan\u003e);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e  \/\/ إطفاء الريلاي تماماً في البداية\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003esetRelayState\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003efalse\u003c\/span\u003e\u003cspan\u003e);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003epzemSerial\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003ebegin\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e9600\u003c\/span\u003e\u003cspan\u003e, SERIAL_8N1, PZEM_RX_PIN, PZEM_TX_PIN);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003eWiFi\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003esoftAP\u003c\/span\u003e\u003cspan\u003e(ssid, password);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003eSerial\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003eprintln\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e\"WiFi Started!\"\u003c\/span\u003e\u003cspan\u003e);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003eserver\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003eon\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e\"\/\"\u003c\/span\u003e\u003cspan\u003e, handleRoot);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003eserver\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003eon\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e\"\/data\"\u003c\/span\u003e\u003cspan\u003e, handleData);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003eserver\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003eon\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003e\"\/recharge\"\u003c\/span\u003e\u003cspan\u003e, HTTP_POST, handleRecharge);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003eserver\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003ebegin\u003c\/span\u003e\u003cspan\u003e();\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e}\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003evoid\u003c\/span\u003e\u003cspan\u003e \u003c\/span\u003e\u003cspan\u003eloop\u003c\/span\u003e\u003cspan\u003e() {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003eserver\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003ehandleClient\u003c\/span\u003e\u003cspan\u003e();\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003e  \u003c\/span\u003e\u003cspan\u003eif\u003c\/span\u003e\u003cspan\u003e (\u003c\/span\u003e\u003cspan\u003emillis\u003c\/span\u003e\u003cspan\u003e() - lastUpdateTime \u0026gt;= \u003c\/span\u003e\u003cspan\u003e1000\u003c\/span\u003e\u003cspan\u003e) {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    lastUpdateTime = \u003c\/span\u003e\u003cspan\u003emillis\u003c\/span\u003e\u003cspan\u003e();\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    voltage = \u003c\/span\u003e\u003cspan\u003epzem\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003evoltage\u003c\/span\u003e\u003cspan\u003e();\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    current = \u003c\/span\u003e\u003cspan\u003epzem\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003ecurrent\u003c\/span\u003e\u003cspan\u003e();\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    power   = \u003c\/span\u003e\u003cspan\u003epzem\u003c\/span\u003e\u003cspan\u003e.\u003c\/span\u003e\u003cspan\u003epower\u003c\/span\u003e\u003cspan\u003e();\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    \u003c\/span\u003e\u003cspan\u003eif\u003c\/span\u003e\u003cspan\u003e (\u003c\/span\u003e\u003cspan\u003eisnan\u003c\/span\u003e\u003cspan\u003e(voltage)) voltage = \u003c\/span\u003e\u003cspan\u003e0.0\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    \u003c\/span\u003e\u003cspan\u003eif\u003c\/span\u003e\u003cspan\u003e (\u003c\/span\u003e\u003cspan\u003eisnan\u003c\/span\u003e\u003cspan\u003e(current)) current = \u003c\/span\u003e\u003cspan\u003e0.0\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    \u003c\/span\u003e\u003cspan\u003eif\u003c\/span\u003e\u003cspan\u003e (\u003c\/span\u003e\u003cspan\u003eisnan\u003c\/span\u003e\u003cspan\u003e(power))   power = \u003c\/span\u003e\u003cspan\u003e0.0\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\u003cspan\u003e    \/\/ تشغيل التغذية طالما هناك رصيد\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    \u003c\/span\u003e\u003cspan\u003eif\u003c\/span\u003e\u003cspan\u003e (remainingEnergy \u0026gt; \u003c\/span\u003e\u003cspan\u003e0\u003c\/span\u003e\u003cspan\u003e) {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e      \u003c\/span\u003e\u003cspan\u003esetRelayState\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003etrue\u003c\/span\u003e\u003cspan\u003e);\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003e      \u003c\/span\u003e\u003cspan\u003eif\u003c\/span\u003e\u003cspan\u003e (power \u0026gt; \u003c\/span\u003e\u003cspan\u003e0\u003c\/span\u003e\u003cspan\u003e) {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e        \u003c\/span\u003e\u003cspan\u003efloat\u003c\/span\u003e\u003cspan\u003e consumedThisSecond = (power \/ \u003c\/span\u003e\u003cspan\u003e1000.0\u003c\/span\u003e\u003cspan\u003e) \/ \u003c\/span\u003e\u003cspan\u003e3600.0\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        remainingEnergy -= consumedThisSecond;\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        consumedEnergy += consumedThisSecond;\u003c\/span\u003e\u003c\/div\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n\u003cspan\u003e        \u003c\/span\u003e\u003cspan\u003eif\u003c\/span\u003e\u003cspan\u003e (remainingEnergy \u0026lt;= \u003c\/span\u003e\u003cspan\u003e0\u003c\/span\u003e\u003cspan\u003e) {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e          remainingEnergy = \u003c\/span\u003e\u003cspan\u003e0\u003c\/span\u003e\u003cspan\u003e;\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e        }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e      }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e    } \u003c\/span\u003e\u003cspan\u003eelse\u003c\/span\u003e\u003cspan\u003e {\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e      \u003c\/span\u003e\u003cspan\u003esetRelayState\u003c\/span\u003e\u003cspan\u003e(\u003c\/span\u003e\u003cspan\u003efalse\u003c\/span\u003e\u003cspan\u003e);\u003c\/span\u003e\u003cspan\u003e \/\/ قطع التغذية عادلاً وفوراً\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e    }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e  }\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e}\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv style=\"text-align: right;\"\u003e\u003cstrong\u003eرابط فديو الشرح\u003c\/strong\u003e\u003c\/div\u003e\n\u003c\/div\u003e","brand":"SkyTech","offers":[{"title":"Default Title","offer_id":48742598672537,"sku":null,"price":250000.0,"currency_code":"IQD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0708\/8131\/2921\/files\/photo_5_2026-08-06_16-17-09.jpg?v=1786022348","url":"https:\/\/skyteches.com\/ku\/products\/smart-prepaid-energy-meter-esp32-electricity-monitor-automated-control","provider":"SkyTech","version":"1.0","type":"link"}