Hallo zusammen,
die aktuelle Hitze durch die Sonneneinstrahlung macht mich noch halb wahnsinnig.
Ich würde gerne die Rolladen meines Hauses Fassadenweise automatisch fahren sobald die Sonne auch nur in die Nähe kommt.
Jetzt habe ich den Code aber noch nicht ausprobieren können, weil ich das Astro::Coord::ECI und die anderen CPAN-Module nicht habe ...
@makki:
gibt es da eine Chance die Module zu bekommen ohne sie selbst zu compilen, oder versuch ich hier wieder mal dem wiregate mehr Logik zu verpassen als eigentlich gewünscht?
Grüße,
Julian
die aktuelle Hitze durch die Sonneneinstrahlung macht mich noch halb wahnsinnig.
Ich würde gerne die Rolladen meines Hauses Fassadenweise automatisch fahren sobald die Sonne auch nur in die Nähe kommt.
Code:
# Einstellungen # die eigenen Koordinaten # # Koordinatenformat: # aktuelle Koordinaten feststellen im Format Grad - also xx,xxxxxx # Koordinaten entweder mit einfachem GPS, oder bspw. über Google Maps oder Google Earth # ablesen # auf google.de gehen und nach "xx.xxxxxx degrees in radians" suchen # Google verrät einem das Ergebnis, das hier eintragen # # Höhe über null: entweder per GPS/Höhenmesser feststellen, # oder auf wikipedia die nächstgelegene Stadt raussuchen und da in den Daten nachlesen my ($lat, $lon, $elev) = ( 0.914027184, # längengrad in radians 0.12383111, # breitengrad in radians 59 / 1000 # Höhe über normalnull in meter ); # die Fassaden und deren Rolläden/Beschattungs-Gruppenadressen festlegen # die Zahl ist der Winkel zwischen Norden und "senkrechte auf die Fassade" # => echter Osten = 90°, echter Süden = 180°, echter Westen = 270°, echter Norden = 0° # aber wessen Haus steht schon korrekt nach diesen Himmelsrichtungen. my %GAFassaden = ( 60 => ("2/2/0"), 150 => ("2/3/0", "2/3/1"), 240 => ("2/2/2", "2/2/3", "2/2/4", "2/2/5", "2/2/6", "2/3/2"), 330 => ("2/2/1", "2/3/3") ); # ab und bis zu welchem Einfallwinkel auf die Fassade soll die Fassade als beschienen # betrachtet werden; standard sind 45 Grad my $einfallwinkel = 45; # welche Position soll das Beschattungsprodukt (= Rolladen) einnehmen, # wenn Sonneneinfall gemeldet wird? # je nach angegebener Gruppenadresse und Fähigkeiten des dahinter hängenden Aktors # sollte das hier eine Fahrtrichtung, oder eine Position sein (standard: 1, abwärts fahren) my $beschattungsposition = 1; # welche Position soll das Beschattungsprodukt (= Rolladen einnehmen), # wenn kein Sonneneinfall gemeldet wird? # Angabe wie Beschattungsposition my $offenposition = 0; # eine Gruppenadresse über welche die Automatisierung gesperrt werden kann # bspw. um nicht nachts die Rolläden rumzufahren # oder wenn die Hitzewelle nachgelassen hat für den Rest des Jahres my $GAsperre = "0/0/8"; # ab hier eigentlich nurnoch Programmcode und wahrscheinlich # keine Notwendigkeit was zu konfigurieren # festlegen wie oft wir normalerweise laufen $plugin_info{$plugname.'_cycle'} = 300; # feststellen, ob die Automatik abgeschaltet wurde # dazu wird ausschließlich der Nachrichten-Cache des Wiregate abgefragt if (knx_read($GAsperre, 0, 1) == 1) { # wenn gesperrt ist, dann nurnoch stündlich laufen - wir fahren ja eh nix rum $plugin_info{$plugname.'_cycle'} = 3600; return "Beschattungsautomatik gesperrt durch GA ", $GAsperre; } # und finally: # wenn wir nicht gesperrt sind, weiterlaufen # Module laden use Astro::Coord::ECI; use Astro::Coord::ECI::Sun; use Astro::Coord::ECI::TLE; use Astro::Coord::ECI::Utils qw{rad2deg deg2rad}; # aktuelle Zeit my $time = time (); # die eigenen Koordinaten my $loc = Astro::Coord::ECI->geodetic($lat, $lon, $elev); # Sonne instanziieren :) my $sun = Astro::Coord::ECI::Sun->universal($time); # feststellen wo die Sonne grade ist my ($azimuth, $elevation, $range) = $loc->azel($sun); # und feststellen wo die Sonne eben noch war my $lastAzimuth = $plugin_info{$plugname.'_lastAzimuth'}; # den Einfallwinkel in radians umrechnen, brauchen wir so $einfallwinkel = deg2rad($einfallwinkel); while (($fassadenwinkel, @GAs) = each(%GAFassaden) { # den Winkel noch in radians umrechnen $fassadenwinkel = deg2rad($fassadenwinkel); # über alle Fassaden laufen und jeweils schauen ob Sonneneinfall errechnet ist if ($azimuth > ($fassadenwinkel - $einfallwinkel) && $azimuth < ($fassadenwinkel + $einfallwinkel)) { # diese Fassade gilt es Sonnenbestrahlt foreach (@GAs) { knx_write($_, $beschattungsposition); } } elsif ($lastAzimuth < ($fassadenwinkel + $einfallwinkel) && $lastAzimuth > ($fassadenwinkel - $einfallwinkel)) { # eben war diese Wand noch beschienen - jetzt nicht mehr # also die Beschattung wieder zurücknehmen foreach (@GAs) { knx_write($_, $offenposition); } } } # für die nächste Iteration den aktuellen Sonnenstand merken # damit wir die Beschattung ggf. wieder zurücknehmen können $plugin_info{$plugname.'_lastAzimuth'} = $azimuth; # und fertig return "aktuelle Sonnenposition gegen Norden: ", rad2deg($azimuth), " Grad";
@makki:
gibt es da eine Chance die Module zu bekommen ohne sie selbst zu compilen, oder versuch ich hier wieder mal dem wiregate mehr Logik zu verpassen als eigentlich gewünscht?
Grüße,
Julian
Kommentar