| name | renewable-energy-planning |
| description | When the user wants to plan renewable energy supply chains, optimize wind or solar logistics, or manage clean energy operations. Also use when the user mentions "solar logistics," "wind farm operations," "renewable energy supply chain," "green energy planning," "battery storage," "solar panel distribution," "wind turbine logistics," or "clean energy optimization." For power grids, see power-grid-optimization. For energy storage, see energy-storage-optimization. |
Renewable Energy Planning
You are an expert in renewable energy supply chain planning and optimization. Your goal is to help design and optimize the logistics, operations, and supply chains for wind, solar, and other renewable energy systems, balancing cost, reliability, sustainability, and grid integration.
Initial Assessment
Before planning renewable energy operations, understand:
-
Energy Source & Technology
- What renewable type? (solar PV, wind, hydro, biomass, geothermal)
- Installation scale? (residential, commercial, utility-scale)
- Technology specifications? (panel types, turbine models)
- Geographic locations and sites?
-
Project Phase
- Development stage? (planning, construction, operation)
- Timeline and milestones?
- Existing infrastructure or greenfield?
- Grid connection status?
-
Supply Chain Scope
- Manufacturing and sourcing?
- Transportation and logistics?
- Installation and commissioning?
- Operations and maintenance (O&M)?
-
Objectives & Constraints
- Primary goals? (cost, speed, sustainability)
- Budget and financing structure?
- Regulatory requirements and incentives?
- Environmental or community constraints?
Renewable Energy Supply Chain Framework
End-to-End Supply Chain
Upstream (Manufacturing):
- Raw material sourcing (silicon, rare earths, steel)
- Component manufacturing (panels, turbines, batteries)
- Quality control and testing
- Supplier management
Midstream (Logistics):
- International shipping (containers, heavy-lift)
- Domestic transportation (truck, rail, specialized)
- Warehousing and staging
- Customs and compliance
Downstream (Installation & Operation):
- Site preparation and construction
- Installation and commissioning
- Grid connection and testing
- Ongoing operations and maintenance
Solar Energy Logistics
Solar Panel Supply Chain
Component Structure:
- Photovoltaic modules (panels)
- Inverters
- Racking and mounting systems
- Electrical components (cables, connectors)
- Monitoring systems
Planning Model:
import numpy as np
import pandas as pd
from pulp import *
def optimize_solar_supply_chain(projects, suppliers, warehouses, costs):
"""
Optimize solar component supply chain from suppliers to project sites
Parameters:
- projects: list of {id, location, demand_mw, installation_date}
- suppliers: list of {id, location, capacity_mw, lead_time}
- warehouses: list of {id, location, capacity, cost_per_mw}
- costs: dict with transportation and inventory costs
"""
prob = LpProblem("Solar_Supply_Chain", LpMinimize)
x_sw = {}
for s in range(len(suppliers)):
for w in range(len(warehouses)):
x_sw[s, w] = LpVariable(f"Supplier_{s}_Warehouse_{w}",
lowBound=0)
y_wp = {}
for w in range(len(warehouses)):
for p in range(len(projects)):
y_wp[w, p] = LpVariable(f"Warehouse_{w}_Project_{p}",
lowBound=0)
total_cost = []
for (s, w), var x_sw.items():
distance = calculate_distance(
suppliers[s][],
warehouses[w][]
)
total_cost.append(costs[] * distance * var)
w ((warehouses)):
warehouse_volume = lpSum([x_sw[s, w] s ((suppliers))])
total_cost.append(warehouses[w][] * warehouse_volume)
(w, p), var y_wp.items():
distance = calculate_distance(
warehouses[w][],
projects[p][]
)
total_cost.append(costs[] * distance * var)
prob += lpSum(total_cost)
s ((suppliers)):
prob += lpSum([x_sw[s, w] w ((warehouses))]) <= \
suppliers[s][]
w ((warehouses)):
prob += lpSum([x_sw[s, w] s ((suppliers))]) <= \
warehouses[w][]
w ((warehouses)):
inflow = lpSum([x_sw[s, w] s ((suppliers))])
outflow = lpSum([y_wp[w, p] p ((projects))])
prob += inflow == outflow
p ((projects)):
prob += lpSum([y_wp[w, p] w ((warehouses))]) >= \
projects[p][]
prob.solve(PULP_CBC_CMD(msg=))
{
: LpStatus[prob.status],
: value(prob.objective),
: {(s, w): x_sw[s, w].varValue
(s, w) x_sw x_sw[s, w].varValue > },
: {(w, p): y_wp[w, p].varValue
(w, p) y_wp y_wp[w, p].varValue > }
}
():
np.sqrt((loc1[] - loc2[])** + (loc1[] - loc2[])**) *
projects = [
{: , : (, -),
: , : },
{: , : (, -),
: , : },
]
suppliers = [
{: , : (, ),
: , : },
{: , : (, -),
: , : },
]
warehouses = [
{: , : (, -),
: , : },
{: , : (, -),
: , : },
]
costs = {
: ,
: ,
}
result = optimize_solar_supply_chain(projects, suppliers, warehouses, costs)
Installation Scheduling
def schedule_solar_installation(projects, crews, equipment):
"""
Schedule solar installation activities
Parameters:
- projects: list of {id, size_mw, location, earliest_start, deadline}
- crews: list of {id, capacity_mw_per_day, availability}
- equipment: list of {type, quantity, required_per_mw}
"""
from pulp import *
import datetime
prob = LpProblem("Installation_Schedule", LpMinimize)
horizon = 180
periods = range(horizon)
x = {}
for p, project in enumerate(projects):
for c, crew in enumerate(crews):
for t in periods:
x[p, c, t] = LpVariable(f"Project_{p}_Crew_{c}_Day_{t}",
cat='Binary')
completion = {}
for p in range(len(projects)):
completion[p] = LpVariable(f"Completion_{p}", lowBound=0)
prob += lpSum([completion[p] for p in range(len(projects))])
for c in ((crews)):
t periods:
prob += lpSum([x[p, c, t] p ((projects))]) <=
p, project (projects):
days_needed = project[] / (
crews[c][] c ((crews))
)
prob += lpSum([x[p, c, t]
c ((crews))
t periods]) >= days_needed
p ((projects)):
t periods:
prob += completion[p] >= t * lpSum([x[p, c, t]
c ((crews))])
prob.solve(PULP_CBC_CMD(msg=))
schedule = {}
p ((projects)):
assigned_days = [(c, t) (p_, c, t) x
p_ == p x[p_, c, t].varValue > ]
schedule[projects[p][]] = {
: assigned_days,
: completion[p].varValue
}
schedule
Wind Energy Logistics
Wind Turbine Components
Major Components:
- Tower sections (3-4 pieces, 80-120m total height)
- Nacelle (generator housing, 50-100 tons)
- Blades (3 per turbine, 50-80m length each)
- Hub and rotor
- Foundation components
Heavy-Haul Transportation
class WindTurbineLogistics:
"""
Manage logistics for wind turbine transportation and installation
"""
def __init__(self, wind_farm_location, turbine_specs):
self.wind_farm = wind_farm_location
self.turbine_specs = turbine_specs
def plan_heavy_haul_route(self, origin, destination, component_type):
"""
Plan heavy-haul route considering constraints
Returns feasible route and cost estimate
"""
constraints = {
'blade': {
'max_length': 80,
'max_weight': 25,
'requires_special_trailer': True,
'clearance_needed': True,
'road_width_min': 5
},
'nacelle': {
'max_weight': 100,
'requires_crane': True,
'road_grade_max': 8,
'bridge_capacity_needed': 150
},
'tower': {
'max_length': 40,
'max_weight': ,
:
}
}
component_constraints = constraints.get(component_type, {})
route = {
: .calculate_route_distance(origin, destination),
: ,
: [],
: [],
:
}
avg_speed =
route[] = route[] / avg_speed
component_constraints.get():
route[].append()
route[] +=
component_constraints.get():
route[].append()
route[] +=
route[] += route[] *
route
():
numpy np
np.sqrt((dest[] - origin[])** + (dest[] - origin[])**) *
():
install_time_days =
sequence = []
current_day =
turbine turbines:
delivery_dates = {
: current_day - ,
: current_day - ,
: current_day - ,
: current_day
}
sequence.append({
: turbine[],
: current_day,
: current_day + install_time_days,
: delivery_dates
})
current_day += install_time_days
sequence
logistics = WindTurbineLogistics(
wind_farm_location=(, -),
turbine_specs={: , : }
)
route = logistics.plan_heavy_haul_route(
origin=(, -),
destination=(, -),
component_type=
)
()
()
()
Crane and Equipment Scheduling
def schedule_crane_operations(turbines, cranes, weather_windows):
"""
Schedule crane operations for turbine installation
Must consider weather constraints (wind speed limits)
"""
from pulp import *
prob = LpProblem("Crane_Scheduling", LpMinimize)
days = len(weather_windows)
x = {}
for t, turbine in enumerate(turbines):
for c, crane in enumerate(cranes):
for d in range(days):
if weather_windows[d]['suitable_for_crane']:
x[t, c, d] = LpVariable(f"Turbine_{t}_Crane_{c}_Day_{d}",
cat='Binary')
completion = {}
for t in range(len(turbines)):
completion[t] = LpVariable(f"Done_{t}", lowBound=0)
max_completion = LpVariable("Makespan", lowBound=0)
prob += max_completion
for t in range(len(turbines)):
prob += max_completion >= completion[t]
for t ((turbines)):
prob += lpSum([x[t, c, d] (t_, c, d) x t_ == t]) ==
c ((cranes)):
d (days):
turbines_on_day = [x[t, c, d] (t, c_, d_) x
c_ == c d_ == d]
turbines_on_day:
prob += lpSum(turbines_on_day) <=
t ((turbines)):
(t_, c, d) x:
t_ == t:
prob += completion[t] >= d * x[t, c, d]
prob.solve(PULP_CBC_CMD(msg=))
schedule = []
(t, c, d) x:
x[t, c, d].varValue > :
schedule.append({
: turbines[t][],
: cranes[c][],
: d,
: weather_windows[d]
})
{
: schedule,
: max_completion.varValue
}
Operations & Maintenance (O&M)
Preventive Maintenance Scheduling
import pandas as pd
import numpy as np
class RenewableEnergyOM:
"""
Operations and maintenance optimization for renewable energy assets
"""
def __init__(self, assets, maintenance_plans):
self.assets = assets
self.maintenance_plans = maintenance_plans
def schedule_preventive_maintenance(self, horizon_days=365):
"""
Schedule preventive maintenance to minimize downtime and cost
"""
from pulp import *
prob = LpProblem("PM_Scheduling", LpMinimize)
x = {}
for a, asset in enumerate(self.assets):
for m, plan in enumerate(self.maintenance_plans):
for t in range(horizon_days):
x[a, m, t] = LpVariable(f"Asset_{a}_Maint_{m}_Day_{t}",
cat='Binary')
total_cost = []
for (a, m, t), var in x.items():
plan = self.maintenance_plans[m]
asset = self.assets[a]
maint_cost = plan[]
downtime_hours = plan[]
lost_production = asset[] * downtime_hours
production_value = lost_production * asset[]
total_cost.append((maint_cost + production_value) * var)
prob += lpSum(total_cost)
a, asset (.assets):
m, plan (.maintenance_plans):
plan[] asset[]:
frequency = plan[]
num_required = horizon_days // frequency
prob += lpSum([x[a, m, t] t (horizon_days)]) >= num_required
max_crew_per_day =
t (horizon_days):
prob += lpSum([x[a, m, t] (a, m, t_) x t_ == t]) <= max_crew_per_day
a ((.assets)):
t (horizon_days):
prob += lpSum([x[a, m, t] m ((.maintenance_plans))]) <=
prob.solve(PULP_CBC_CMD(msg=))
schedule = []
(a, m, t) x:
x[a, m, t].varValue > :
schedule.append({
: .assets[a][],
: .maintenance_plans[m][],
: t,
: .maintenance_plans[m][],
: .maintenance_plans[m][]
})
schedule
():
sklearn.ensemble RandomForestClassifier
sklearn.preprocessing StandardScaler
X = sensor_data[[, , ,
, ]]
y = historical_failures[]
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
model = RandomForestClassifier(n_estimators=, random_state=)
model.fit(X_scaled, y)
current_data = sensor_data[sensor_data[] == sensor_data[].()]
X_current = current_data[[, , ,
, ]]
X_current_scaled = scaler.transform(X_current)
predictions = model.predict_proba(X_current_scaled)[:, ]
risk_threshold =
high_risk = current_data[predictions > risk_threshold].copy()
high_risk[] = predictions[predictions > risk_threshold]
{
: model.score(X_scaled, y),
: ((X.columns, model.feature_importances_)),
: high_risk[[, ]].to_dict()
}
Energy Production Forecasting
Solar Generation Forecast
def forecast_solar_generation(historical_generation, weather_forecast):
"""
Forecast solar energy generation using weather data
Parameters:
- historical_generation: DataFrame with datetime, actual_mwh
- weather_forecast: DataFrame with datetime, irradiance, cloud_cover, temperature
"""
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
import pandas as pd
data = historical_generation.merge(weather_forecast, on='datetime')
data['hour'] = data['datetime'].dt.hour
data['month'] = data['datetime'].dt.month
data['day_of_year'] = data['datetime'].dt.dayofyear
data['theoretical_max'] = 1 + 0.3 * np.sin(2 * np.pi * data['day_of_year'] / 365)
features = ['irradiance', 'cloud_cover', 'temperature',
'hour', 'month', 'theoretical_max']
X = data[features]
y = data['actual_mwh']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1)
model.fit(X_train, y_train)
forecast = model.predict(weather_forecast[features])
{
: forecast,
: model.score(X_test, y_test),
: ((features, model.feature_importances_))
}
Wind Generation Forecast
def forecast_wind_generation(wind_speed_forecast, turbine_specs):
"""
Forecast wind energy generation from wind speed forecasts
Uses power curve of wind turbine
"""
def power_curve(wind_speed, rated_power, cut_in, rated_speed, cut_out):
"""
Wind turbine power curve
Parameters:
- wind_speed: m/s
- rated_power: MW
- cut_in: minimum wind speed (m/s)
- rated_speed: wind speed at rated power (m/s)
- cut_out: maximum wind speed (m/s)
"""
if wind_speed < cut_in or wind_speed > cut_out:
return 0
elif wind_speed >= rated_speed:
return rated_power
else:
return rated_power * ((wind_speed - cut_in) / (rated_speed - cut_in)) ** 3
generation_forecast = []
for ws in wind_speed_forecast:
power = power_curve(
wind_speed=ws,
rated_power=turbine_specs['rated_power_mw'],
cut_in=turbine_specs['cut_in_speed'],
rated_speed=turbine_specs['rated_wind_speed'],
cut_out=turbine_specs['cut_out_speed']
)
generation_forecast.append(power * turbine_specs['num_turbines'])
return {
'forecast_mwh': generation_forecast,
'capacity_factor': np.mean(generation_forecast) /
(turbine_specs['rated_power_mw'] * turbine_specs['num_turbines'])
}
turbine_specs = {
'rated_power_mw': ,
: ,
: ,
: ,
:
}
wind_forecast = [, , , , , , , , ]
result = forecast_wind_generation(wind_forecast, turbine_specs)
()
Grid Integration & Energy Storage
Grid Connection Planning
def plan_grid_connection(renewable_site, substations, grid_capacity):
"""
Optimize grid connection point for renewable energy project
Parameters:
- renewable_site: {location, capacity_mw}
- substations: list of {id, location, available_capacity_mw, connection_cost}
- grid_capacity: capacity constraints
"""
from pulp import *
prob = LpProblem("Grid_Connection", LpMinimize)
x = {}
for s, substation in enumerate(substations):
if substation['available_capacity_mw'] >= renewable_site['capacity_mw']:
x[s] = LpVariable(f"Connect_to_{s}", cat='Binary')
total_cost = []
for s, var in x.items():
substation = substations[s]
distance = calculate_distance(
renewable_site['location'],
substation['location']
)
line_cost = distance * 1000000
connection_cost = substation['connection_cost']
total_cost.append((line_cost + connection_cost) * var)
prob += lpSum(total_cost)
prob += lpSum([x[s] for s in x]) == 1
prob.solve(PULP_CBC_CMD(msg=0))
selected = [s for s in x if x[s].varValue > 0.5][]
{
: substations[selected][],
: value(prob.objective),
: calculate_distance(
renewable_site[],
substations[selected][]
)
}
():
numpy np
np.sqrt((loc1[] - loc2[])** + (loc1[] - loc2[])**) *
Tools & Libraries
Python Libraries
Optimization:
PuLP: Linear programming
pyomo: Optimization modeling
cvxpy: Convex optimization
Weather & Solar:
pvlib: Photovoltaic modeling
windpowerlib: Wind turbine modeling
solarpy: Solar position calculations
Forecasting:
scikit-learn: Machine learning
xgboost, lightgbm: Gradient boosting
prophet: Time series forecasting
statsmodels: Statistical models
Geospatial:
geopandas: Geographic data
rasterio: Raster data processing
pyproj: Coordinate systems
Commercial Software
Project Management:
- PVsyst: Solar PV system design
- WindPRO: Wind farm design and optimization
- RETScreen: Renewable energy project analysis
- HOMER: Hybrid renewable energy system design
Asset Management:
- Greenbyte: Wind and solar asset management
- 3TIER: Renewable energy forecasting
- SCADA systems: Supervisory control and data acquisition
Supply Chain:
- SAP S/4HANA: ERP with renewable energy modules
- Oracle Primavera: Project scheduling
- Microsoft Project: Project management
Common Challenges & Solutions
Challenge: Supply Chain Disruptions
Problem:
- Component shortages (chips, rare materials)
- Shipping delays (port congestion)
- Trade restrictions and tariffs
Solutions:
- Dual sourcing strategies
- Safety stock for critical components
- Local manufacturing development
- Long-term supplier contracts
- Supply chain visibility tools
Challenge: Transportation Logistics
Problem:
- Oversized component transportation
- Infrastructure limitations (roads, bridges)
- Permitting complexities
- High transportation costs
Solutions:
- Route surveys and planning
- Infrastructure upgrades (cost-benefit)
- Modular designs (smaller components)
- Regional manufacturing/assembly
- Just-in-sequence delivery
Challenge: Weather-Dependent Installation
Problem:
- Crane operations limited by wind
- Seasonal weather patterns
- Schedule delays and cost overruns
Solutions:
- Weather window analysis
- Flexible scheduling with buffers
- Weather forecasting and monitoring
- Alternative installation methods
- Weather-based risk modeling
Challenge: Grid Integration Delays
Problem:
- Limited grid capacity
- Interconnection queue backlogs
- Curtailment of renewable generation
Solutions:
- Early grid studies and applications
- Energy storage pairing
- Power purchase agreements (PPAs)
- Transmission planning coordination
- Grid upgrade cost-sharing
Challenge: Maintenance Access
Problem:
- Remote site locations
- Limited service infrastructure
- Parts availability
- Technician training
Solutions:
- Predictive maintenance (reduce trips)
- Mobile service units
- Spare parts inventory optimization
- Remote monitoring and diagnostics
- Local training programs
Output Format
Renewable Energy Project Plan
Executive Summary:
- Project overview (type, capacity, location)
- Total project cost and timeline
- Key supply chain strategies
- Risk mitigation approach
Supply Chain Plan:
| Component | Supplier | Lead Time | Cost | Delivery Date |
|---|
| Solar Panels (250 MW) | Supplier_A | 90 days | $35M | 2026-08-15 |
| Inverters | Supplier_B | 60 days | $8M | 2026-09-01 |
| Racking | Supplier_C | 75 days | $12M | 2026-08-20 |
Logistics Plan:
| Component | Origin | Mode | Route | Duration | Cost |
|---|
| Panels | Shanghai | Ocean+Truck | Port of LA | 45 days | $2.5M |
| Inverters | Phoenix | Truck | Direct | 2 days | $150K |
Installation Schedule:
| Phase | Duration | Start Date | End Date | Key Activities |
|---|
| Site Prep | 30 days | 2026-07-01 | 2026-07-30 | Grading, foundations |
| Module Install | 60 days | 2026-08-15 | 2026-10-15 | Panel installation |
| Electrical | 30 days | 2026-10-01 | 2026-10-30 | Wiring, inverters |
| Commissioning | 15 days | 2026-11-01 | 2026-11-15 | Testing, grid connection |
Risk Assessment:
| Risk | Impact | Probability | Mitigation |
|---|
| Component delay | High | Medium | Safety stock, alternative suppliers |
| Weather delays | Medium | Medium | Schedule buffer, weather tracking |
| Grid interconnection | High | Low | Early application, coordination |
Questions to Ask
If you need more context:
- What type of renewable energy? (solar, wind, hydro, other)
- What's the project scale and capacity?
- What stage are you in? (planning, construction, operation)
- What's the geographic location?
- What are the key constraints? (budget, timeline, regulatory)
- What supply chain elements need optimization?
- What are the primary risks and concerns?
Related Skills
- energy-logistics: For overall energy supply chain management
- power-grid-optimization: For grid integration and transmission
- energy-storage-optimization: For battery and storage systems
- network-design: For facility location and network optimization
- project-scheduling: For construction and installation scheduling
- demand-forecasting: For energy generation forecasting
- risk-mitigation: For supply chain risk management
- sustainable-sourcing: For responsible material sourcing