منزل مُجهَّز بألواح شمسية + بطارية Tesla Powerwall مرتبط بمنصة VPP — الخوارزمية تقرر في كل ساعة: تبيع، تشحن، تفرغ، أو تشتري من الشبكة
# ═══════════════════════════════════════════════════════════ # VPP Smart Decision Algorithm — Virtual Power Plant # مهندس القوى والطاقة: يمكنك تشغيل هذا الكود مباشرة # pip install pandas matplotlib numpy # ═══════════════════════════════════════════════════════════ import numpy as np import pandas as pd import matplotlib.pyplot as plt # ── إعدادات النظام ────────────────────────────────────────── MAX_BATTERY = 13.5 # سعة البطارية الكاملة (kWh) — Tesla Powerwall MIN_BATTERY = 1.0 # حد الحماية الأدنى (kWh) SELL_PRICE = 0.30 # سعر البيع للشبكة (ريال/kWh) BUY_PRICE = 0.18 # سعر الشراء من الشبكة (ريال/kWh) SOLAR_PEAK = 6.0 # ذروة إنتاج الألواح الشمسية (kW) # ── أسعار الكهرباء بالساعة (هللة/kWh) ────────────────────── HOURLY_PRICES = [ 10, 10, 10, 10, 10, 12, # منتصف الليل → الفجر 15, 18, 20, 22, 25, 27, # الصباح 28, 27, 25, 22, 24, 28, # الظهر → العصر 30, 29, 25, 20, 15, 11 # المساء → الليل ] def generate_solar(hour, cloud_factor=0.85): """توليد الطاقة الشمسية بناءً على الساعة ومعامل الغيوم""" if not (6 <= hour <= 18): return 0.0 base = SOLAR_PEAK * np.sin(np.pi * (hour - 6) / 12) noise = np.random.uniform(-0.3, 0.3) return max(0, base * cloud_factor + noise) def generate_consumption(hour, base_kw=3.0): """نمط استهلاك المنزل على مدار اليوم""" extra = 0 if 7 <= hour <= 9: extra = 2.5 # ذروة الصباح elif 12 <= hour <= 13: extra = 1.5 # وجبة الغداء elif 18 <= hour <= 22: extra = 3.5 # ذروة المساء noise = np.random.uniform(-0.2, 0.2) return max(0.5, base_kw + extra + noise) def vpp_decision(solar, consumption, battery, price_halala): """ ✅ خوارزمية قرار VPP الذكية المدخلات: إنتاج شمسي، استهلاك، مستوى البطارية، سعر الكهرباء المخرجات: القرار، تدفق البطارية، تصدير/استيراد الشبكة """ price = price_halala / 100 # تحويل الهللة إلى ريال net = solar - consumption # القدرة الصافية if net > 0: # ── فائض في الإنتاج ── if price >= 0.22 and battery >= MAX_BATTERY * 0.9: return "بيع للشبكة", 0, net elif battery < MAX_BATTERY: charge = min(net, MAX_BATTERY - battery) return "شحن البطارية", charge, max(0, net - charge) else: return "بيع للشبكة", 0, net else: # ── عجز في الإنتاج ── deficit = abs(net) if price >= 0.25 and battery > MIN_BATTERY + 1: discharge = min(deficit, battery - MIN_BATTERY) return "تفريغ البطارية", -discharge, max(0, deficit - discharge) elif battery <= MIN_BATTERY: return "شراء من الشبكة", 0, deficit else: return "شراء من الشبكة", 0, deficit def simulate_day(cloud_factor=0.85, base_consumption=3.0): """محاكاة يوم كامل (24 ساعة) وحساب الأرباح""" battery = MAX_BATTERY * 0.5 # شحن ابتدائي 50% records = [] for h in range(24): solar = generate_solar(h, cloud_factor) consumption = generate_consumption(h, base_consumption) price = HOURLY_PRICES[h] decision, bat_flow, grid_flow = vpp_decision( solar, consumption, battery, price ) battery = max(MIN_BATTERY, min(MAX_BATTERY, battery + bat_flow)) is_export = grid_flow > 0 and solar > consumption profit = (grid_flow * (price/100) * (1 if is_export else -1)) records.append({ "hour": h, "solar": round(solar, 2), "consumption":round(consumption, 2), "battery": round(battery, 2), "decision": decision, "grid_flow": round(grid_flow, 2), "price": price, "profit": round(profit, 3), }) df = pd.DataFrame(records) total_profit = df["profit"].sum() print(f"✅ إجمالي الربح اليومي: {total_profit:.2f} ريال") return df # ── تشغيل المحاكاة ────────────────────────────────────────── if __name__ == "__main__": df = simulate_day(cloud_factor=0.85, base_consumption=3.0) print(df[["hour", "solar", "consumption", "battery", "decision", "profit"]])