Rustic Retreat
Hot Projects
Live broadcasts and documentation from a remote tech outpost in rustic Portugal. Sharing off-grid life, the necessary research & development and the pursuit of life, without centralized infrastructure.
Subscribe to our new main project Rustic Retreat on the projects own website.
This is an old revision of the document!
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:
and which parts we use technically:
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).
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.
Possibility to calibrate a pyranometer in the field, without another calibrated reference, on a clear-sky day.
Usable as basis for agricultural applications (growth/photosynthetic calculations)
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:
#!/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