Virtual Power Plant — Python Simulation

محاكاة نظام VPP الذكي

منزل مُجهَّز بألواح شمسية + بطارية Tesla Powerwall مرتبط بمنصة VPP — الخوارزمية تقرر في كل ساعة: تبيع، تشحن، تفرغ، أو تشتري من الشبكة

Python Algorithm Solar + Battery Smart Grid V2G Ready Energy Economics
📚 اقرأ المقال التعليمي — سوق الكهرباء ومستقبل VPP
☁️ معامل الغيوم (Cloud Factor) 20%
غائم جداً ⛅مشمس كامل ☀️
⚡ الاستهلاك الأساسي 3 kW
منخفض 🏠مرتفع 🏭
🔋 سعة البطارية (kWh) 13.5 kWh
5 kWh27 kWh
🔍 حدد الساعة لعرض التفاصيل 12:00
12 منتصف الليل11 المساء
☀️
—
إنتاج شمسي كلي
🏠
—
استهلاك كلي
📤
—
مُصدَّر للشبكة
📥
—
مستورد من الشبكة
💰
—
الربح / الخسارة اليومية
☀️ الإنتاج الشمسي مقابل الاستهلاك — كيلوواط (kW) في كل ساعة
🔋 مستوى شحن البطارية على مدار اليوم (kWh)
📊 الطاقة المُصدَّرة والمستوردة + منحنى سعر الكهرباء
🔍 تفاصيل الساعة المحددة
—
🤖 توزيع قرارات الخوارزمية (24 ساعة)
💡 منطق خوارزمية Python:
السعر ≥ 22 هللة + بطارية ممتلئة → بيع للشبكة 💰
فائض + بطارية غير ممتلئة → شحن البطارية 🔋
سعر مرتفع + عجز + بطارية مشحونة → تفريغ البطارية ⚡
سعر منخفض + عجز → شراء من الشبكة 🔌
البطارية < 10% → شحن إجباري 🚨
🐍 كود Python الكامل — خوارزمية قرار 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"]])
📚 ما الذي يُعلمنا إياه هذا المشروع؟
🐍 مهارات Python
توليد بيانات مُحاكاة، تحليل السلاسل الزمنية، بناء خوارزميات قرار، استخدام Pandas و NumPy
⚡ مهارات الطاقة
فهم تدفق القدرة، إدارة البطاريات، التسعير الديناميكي للكهرباء، نمذجة الأحمال
📊 مهارات البيانات
تحليل الأنماط، رسم المنحنيات، تفسير النتائج، اتخاذ القرار المبني على البيانات
🏗️ تطبيق VPP فعلي
هذه الخوارزمية هي النواة الأساسية لأي نظام VPP حقيقي — يمكن توسيعها لآلاف المنازل