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.
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:
Global solar radiation (Rs) is of funfamental importance for human life on earth. 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 convertible 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
Download:
Source Code
Please feel free to contribute by verifying these calculations or extend them to an even more accurate/versatile model for all of us.
# 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