User Tools

Site Tools


Navigation Menu

Flight-Control

<
Previous mounth
03/28/2024
>
Next mounth
SMTWFTS
13
24
24
25
25
26
26
27
27
28
28
2930
1431010203040506
1507080910111213
1614151617181920
1721222324252627









Hot Projects

SEEDStack

SEEDStack - Open 3D printable seed/sprouting systemDIY Food Hacking

UCSSPM

UCSSPM - Unified Clear-Sky Solar Prediction ModelOpen Solar Power

picoReflow

picoReflow - DIY PID Reflow Oven Controller based on RaspberryPiDIY Reflow Soldering

PiGI

PiGI - DIY Geiger Counter based on RaspberryPiRasPi Geiger Counter

DIY ARA-2000

Active Wideband Receiver Antenna for SDR - ARA-2000Wideband Antenna

DSpace

DSPace - Map everythingMap everything!

Mission-Tags

This is an old revision of the document!


Solar-Output prediction model

Using the sun as a renewable energy source isn't really a new invention. Plants have been relying on it for millions of years and our - mostly - green friends seem to handle it pretty well on an instinctive method of operation.

Let's have a simplified look on how much we already depend on solar energy:

  • Global freshwater distribution (oceans→clouds→rain)
  • Global atmospheric conditions/weather/temperature (direct) → flora/fauna
  • Global flora → atmospheric conditions/weather/temperature (indirect)

and which parts we use technically:

  • Agriculture (photosynthesis) → Food
  • Solar energy conversion to heat (mirror/focus)
  • Direct solid-state photon→electron conversion for electrical power

We're depending very much on knowing how much solar energy can be harvested on a certain point on the planet's surface, yet we still commonly refer to 1000W/m2 on any point on Earth as a clear-sky reference. The following model is an open-resource based starting point for a new common model to predict the solar output on a clear-sky day and incorporate any given conversion technique (currently only PV).

Use-Cases

Photo-Voltaic Systems

  • being able to have a more accurate prediction of maximum PV output for a given site/configuration
  • keep PV panel at optimum elevation without a separate optical solar tracker

Solar-Ovens

The system can be easily extended to estimate the optimum parabolic oven-reflector size, to satisfy the energy needs for a given community and their specific position on the planet.

Pyranometer Reference Model

Possibility to calibrate a pyranometer in the field, without another calibrated reference, on a clear-sky day.

Agricultural

Usable as basis for agricultural applications (growth/photosynthetic calculations)

Development

This model is based on algorithms developed by the Environmental and Water Resources Institute of the American Society of Civil Engineers and a few common NOAA/NASA calculations. Apollo-NG's energy management, prediction and logging system fuses this rational prediction model with real time sensor data in order to predict the nominal output power of a PV system and compares the actual output to it.

By now it has become a very advanced clear-sky prediction model, incorporating the following factors:

  • Position on Earth
  • Day of Year
  • Distance Sun-Earth
  • Angle through atmosphere
  • Water in atmosphere
  • Atmospheric turbidity (smog, dust etc.)
  • Direct/diffuse beam radiation
  • PV-Module surface/type/temperature/age

Code

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
########################################################################
#
#   This program is free software: you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
########################################################################

import math, calendar
from math import pi

# Solar constant for the mean distance between the Earth and sun #######

sol_const		=				1367.8

########################################################################
# GEO Parameters (to be fed from GPS)

lat				=				23
lon				=				11
alt				=				0

########################################################################
# Time and Offsets (to be fed from GPS)

day				=				22
month			=				06
year			=				2011
ToD				=				12
tz_off_deg		=				0+lon
dst_off			=				0

########################################################################
# Atmospheric Parameters (to be fed from Argus current sensor data)

# air temperature

atm_temp		=				25.0	

# relative humidity

atm_hum			=				20.0	

# turbidity coefficient - 0 < tc < 1.0 - where tc = 1.0 for clean air
# and tc < 0.5 for extremely turbid, dusty or polluted air

atm_tc			=				0.8

########################################################################
# PV System Parameters (actual PV data of Odysseys modules)

# Solar Panel Surface in m²

pv_a			=				1.67

# Module Efficiency %

pv_eff			=				20

# Mod. neg. Temp. Coeff (0.35=mono)

pv_tk			=				0.35

# Mod. Temperature in °C - should be measured on the back of module

pv_temp			=				30

# Mod. Age related Coeff (95% after 1-2y)

pv_ak			=				0.98



########################################################################
##  MAIN
########################################################################

# get Julian Day (Day of Year)

if 								calendar.isleap(year):

	# Leap year, 366 days
	lMonth 		= 		[0,31,60,91,121,152,182,213,244,274,305,335,366]

else:

	# Normal year, 365 days
	lMonth 		= 		[0,31,59,90,120,151,181,212,243,273,304,334,365]

DoY 			= 				lMonth[month-1] + day

print "--------------------------------------------------------------"

print "%d.%d.%d | %d | %f | " % (day, month, year, DoY, ToD, )

print "--------------------------------------------------------------"

print "Solar Constant                               : %s" % sol_const
print "Atmospheric turbidity coefficient            : %s" % atm_tc

print "--------------------------------------------------------------"


# inverse relative distance factor for distance between Earth and Sun ##

sun_rel_dist_f 	= 1.0/(1.0-9.464e-4*math.sin(DoY)- 						\
				+ 0.01671*math.cos(DoY)- 								\
				+ 1.489e-4*math.cos(2.0*DoY)-2.917e-5*math.sin(3.0*DoY)-\
				+ 3.438e-4*math.cos(4.0*DoY))**2

print "Inverse relative distance factor             : %s" % sun_rel_dist_f


# solar declination ####################################################

sun_decl 		= (math.asin(0.39785*(math.sin(((278.97+(0.9856*DoY)) 	\
				+ (1.9165*(math.sin((356.6+(0.9856*DoY)) 				\
				* (math.pi/180)))))*(math.pi/180))))*180) 				\
				/ math.pi


print "Sun declination                              : %s°" % sun_decl


# equation of time #####################################################
# (More info on http://www.srrb.noaa.gov/highlights/sunrise/azel.html)

eqt				= (((5.0323-(430.847*math.cos((((2*math.pi)*DoY)/366)+4.8718)))\
				+ (12.5024*(math.cos(2*((((2*math.pi)*DoY)/366)+4.8718))))\
				+ (18.25*(math.cos(3*((((2*math.pi)*DoY)/366)+4.8718))))\
				- (100.976*(math.sin((((2*math.pi)*DoY)/366)+4.8718))))\
				+ (595.275*(math.sin(2*((((2*math.pi)*DoY)/366)+4.8718))))\
				+ (3.6858*(math.sin(3*((((2*math.pi)*DoY)/366)+4.871))))\
				- (12.47*(math.sin(4*((((2*math.pi)*DoY)/366)+4.8718)))))\
				/ 60

print "Equation of time                             : %s min" % eqt


# time of solar noon ###################################################

sol_noon		= ((12+dst_off)-(eqt/60))-((tz_off_deg-lon)/15)

print "Solar Noon                                   : %s " % sol_noon


# solar zenith angle in DEG ############################################

sol_zen			= math.acos(((math.sin(lat*(math.pi/180)))				\
				* (math.sin(sun_decl*(math.pi/180))))					\
				+ (((math.cos(lat*((math.pi/180))))						\
				* (math.cos(sun_decl*(math.pi/180))))					\
				* (math.cos((ToD-sol_noon)*(math.pi/12)))))				\
				* (180/math.pi)

# in extreme latitude, values over 90 may occurs.
#if sol_zen > 90:

print "Solar Zenith Angle                           : %s° " % sol_zen


# barometric pressure of the measurement site
# (this should be replaced by the real measured value) in kPa

atm_press		= 101.325												\
				* math.pow(((288-(0.0065*(alt-0)))/288)					\
				, (9.80665/(0.0065*287)))

atm_press=100.5

print "Estimated Barometric Pressure at site        : %s kPa" % atm_press


# Estimated air vapor pressure in kPa ###################################

atm_vapor_press	= (0.61121*math.exp((17.502*atm_temp)					\
				/ (240.97+atm_temp)))									\
				* (atm_hum/100)

print "Estimated Vapor Pressure at site             : %s kPa" % atm_vapor_press


# extraterrestrial radiation in W/m2 ###################################

extra_terr_rad	= (sol_const*sun_rel_dist_f)							\
				* (math.cos(sol_zen*(math.pi/180)))

print "Estimated Extraterrestrial radiation         : %s W/m²" % extra_terr_rad


# precipitable water in the atmosphere in mm ###########################

atm_prec_h2o	= ((0.14*atm_vapor_press)*atm_press)+2.1

print "Estimated precipitable water in Atmosphere   : %s mm" % atm_prec_h2o


# clearness index for direct beam radiation [unitless] #################

clr_idx_beam_rad= 0.98*(math.exp(((-0.00146*atm_press)					\
				/ (atm_tc*(math.sin((90-sol_zen)*(math.pi/180)))))		\
				- (0.075*(math.pow((atm_prec_h2o						\
				/ (math.sin((90-sol_zen)*(math.pi/180)))),0.4)))))

print "Clearness index for direct beam radiation    : %s" % clr_idx_beam_rad


# transmissivity index for diffuse radiation [unitless] ################

if 								(clr_idx_beam_rad > 0.15):
	trns_idx_diff_rad=			0.35-(0.36*clr_idx_beam_rad)
else:
	trns_idx_diff_rad=			0.18+(0.82*clr_idx_beam_rad)

print "Transmissivity index for diffuse radiation   : %s" % trns_idx_diff_rad


# Model Estimated Shortwave Radiation (W/m2) ###########################

est_sol_rad		= 				(clr_idx_beam_rad + trns_idx_diff_rad)	\
				* 				extra_terr_rad

print "--------------------------------------------------------------"
print "Model Estimated Shortwave Radiation (RSO)    : \033[1;33m%3.1f W/m²\033[0m" % est_sol_rad


# Estimate Output of Odyssey (solar panels at nominal Efficiency) ######

est_p_out		= 				(est_sol_rad*pv_a) / 100 * pv_eff

print "Model Estimated Max. PV-Power Output         : \033[1;31m%3.1f W\033[0m \033[1;37m@ %d%% Mod Eff\033[0m" % (est_p_out, pv_eff)


# Estimate conversion loss due to module temperature ###################

if 								( pv_temp > 25 ):
	
    pv_p_loss 	= 				(pv_temp-25 ) * pv_tk
	pv_p_loss_p = 				(est_p_out/100) * pv_p_loss

print "Model estimated PV-Module temp conv. loss       : \033[1;37m%2.1f W / %2.1f%%\033[0m" % (pv_p_loss_p, pv_p_loss)

# Estimate conversion loss due to module age

est_pv_age_loss	= 				est_p_out - (est_p_out*pv_ak)

print "Model estimated PV-Module aging loss            : \033[1;37m%03.1f W\033[0m" % est_pv_age_loss

# Optimal PV Module Angle to Sun

print "Model recommends PV-Module angle to Sun      : \033[1;37m%02.1f°\033[0m" % sol_zen

# Estime Power output of Odyssey (solar panels at corrected Efficiency)

est_real_p_out	= 				est_p_out - est_pv_age_loss-pv_p_loss_p

print "--------------------------------------------------------------"
print "Model Estimated Real PV-Power Output         : \033[1;31m%3.1f W\033[0m" % est_real_p_out


<note dl> Download

</note>

<note important> Please feel free to contribute by verifying these calculations or extend them to an even more accurate/versatile model for all of us. </note>

# python solar-prediction.py 
--------------------------------------------------------------
22.6.2011 | 173 | 12.000000 | 
--------------------------------------------------------------
Solar constant                               : 1367.8
Atmospheric turbidity coefficient            : 0.8
--------------------------------------------------------------
Inverse relative distance factor             : 0.968392237142
Sun declination                              : 23.4438070502°
Equation of time                             : -1.71440597602 min
Solar Noon                                   : 12.0285734329 
Solar zenith angle                           : 0.593383030197° 
Estimated barometric Pressure at site        : 100.5 kPa
Estimated vapor pressure at site             : 0.633406906142 kPa
Estimated extraterrestrial radiation         : 1324.49586817 W/m²
Estimated precipitable water in atmosphere   : 11.0120351694 mm
Clearness index for direct beam radiation    : 0.670704071246
Transmissivity index for diffuse radiation   : 0.108546534352
--------------------------------------------------------------
Model estimated shortwave radiation (RSO)    : 1032.1 W/m²
Model estimated max. PV-Power output         : 344.7 W @ 20% Mod Eff
Model estimated PV-Module temp conv. loss    : 6.0 W / 1.8%
Model estimated PV-Module aging loss         : 6.9 W
Model recommends PV-Module angle to Sun      : 0.6°
--------------------------------------------------------------
Model estimated real PV-Power output         : 331.8 W

Sources