Direkte Sonneneinstrahlung auf ein Solarpanel

Begonnen von erwin, 18 April 2015, 15:58:19

Vorheriges Thema - Nächstes Thema

erwin

An die Mathematiker oder Astronomen unter euch!

Ich brauche etwas Unterstützung bzw. die Bestätigung, dass mein Ansatz richtig ist:

Ich versuche die direkte Sonneneinstrahlung über den Tagesverlauf auf ein Solarpanel darzustellen.
Dazu hab ich mir überlegt, dass der cos der 2 Vektoren: Sonne und Panel der Faktor der auf das Panel eintrffenden Strahlung ist.
Den Sonnenstand hole ich mir aus dem Twilight Modul.
Empirisch schaut die Kurve schon ganz passabel aus, leider war in der letzten Woche kein "idealer" Sonnentag, daher die vielen Zacken....

Zur Erklärung der Kurven:
rot - momentane gemessene Leistung des Solarpanels.
grün - 15min Mittel gemessene Leistung des Solarpanels.
blau - Tagesertrag des Panels
rosa - Erwartete Strahlung lt. Wetterbericht.
gelb - die Kurve, um die es geht.


Die Ecke in der gelben Kurve kurz vor 20 Uhr wird durch den Sonnenuntergang hervorgerufen.
Weiters fehlt noch das clipping, falls der cos negativ ist, d.h. die Sonne von hinten auf das Panel scheint....

das reading wird als Userreading im twilight Modul definiert
Sunimpact:azimuth {MH_sunimpact(ReadingsVal("myTwilight","azimuth",180),ReadingsVal("myTwilight","elevation",0))}

und das wär der code, der das ausrechnet:
nachtrag: Die Panelgeometrie ist hier noch "hardcoded": Dachneigung 20Grad, Ausrichtung 225 Grad, also genau nach SW.

## calculate sunradiation into a tilted square
## parameters: azimut, elevation
## usage: print MH_sunimpact(135.25,44.35)  . "\n";
## used as userreading in twilight module
## returns cos of Vector-angel range 0-1
##
sub MH_sunimpact($$) {
   my ($azimut,$elevation) = @_;
   return 0 if ($elevation < 0);

   my $grad_rad = 3.14159/180;
   my $panelaz = 45 * $grad_rad;
   my $panelel = 20 * $grad_rad;

   $azimut = $azimut * $grad_rad;
   $elevation = $elevation * $grad_rad;

   # calc sunvector
#   my $xs = cos($azimut) * cos($elevation);
#   my $ys = sin($azimut) * cos($elevation);
#   my $zs = sin($elevation);
#
   # calc Panelvector
#   my $xp = -cos($panelaz) * sin($panelel);
#   my $yp = -sin($panelaz) * sin($panelel);
#   my $zp = cos($panelel);

   my $cosw = -cos($elevation) * sin($panelel) * cos($azimut - $panelaz) + sin($elevation) * cos($panelel);
   return $cosw;
}

Bitte um Nachsicht, Feedback, Korrektur, meine Mathematik Kenntnisse sind nicht mehr ganz frisch....
Falls ich richtig liege, würde ich das ins wiki stellen.
l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...