Stellung der Sonne im Floorplan nachbilden

Begonnen von Nico, 07 Mai 2013, 10:35:01

Vorheriges Thema - Nächstes Thema

Nico

edit:
Hallo zusammen,

ich habe die Idee die Stellung der Sonne auf dem Floorplan mit abzubilden. Hierzu habe ich mit SweetHome3D 9 verschiedene png Dateien  (+1 Nacht) mit verschiedenen Sonnenständen erstellt. (Anhang 1 bis 4)

Das erste Bild mit einem "define bild1laden at{sunrise} attr Grundriss fp_backgroundimg sun0" zu laden stellt kein Problem dar.
Wenn ich nun jedoch stündlich das nächste Bild nachlade (at +01:00:00) komme ich aufgrund der langen (kurzen) Tage im Sommer (Winter) nicht richtig aus.
Das letzte Bild müsste ja etwa eine Stunde vor Sonnenuntergang geladen werden, das Nachtbild bei Sonnenuntergang.

Meiner Meinung nach müsste ich also die Zeit zwischen Sonnenaufgang und Sonnenuntergang in 10 gleichlange Teile aufteilen.

Mein 3. Ansatz funktioniert in perl unter Windows aber nicht in der fhem.cfg:

define BG_Wechsel_Notify notify BG_Wechsel_Notify {\
my $hh = substr(sunset_rel(),0,2);;\
my $mm = substr(sunset_rel(),3,2);;\
my $ss = substr(sunset_rel(),6,2);;\
my $dauer=$hh*3600+$mm*60+$ss;;\
my $dauer_rel=$dauer/10;;\
my $schrittweite=$dauer_rel;;\
for(my $i = 0;;$i <= 10;;$i++)\
{\
if ($i > 0)\
{\
$dauer_rel += $schrittweite;;\
};;\
$m = int $dauer_rel / 60;;\
$s = $dauer_rel - ($m * 60);;\
$h = int $m / 60;;\
$m = $m - ($h * 60);;\
$timestring = printf("%02d:%02d:%02d",$h,$m,$s);;\
chop($timestring);;\
fhem "define BG_Wechsel_$i at +$timestring attr Grundriss fp_backgroundimg sun$i";;\
};;\
}


Habe ich etwas übersehen oder falsch gemacht?

Nico

Falls es jemanden interessiert hier die (bei mir) funktionierende Lösung:

define BG_Wechsler at *{sunrise} trigger BG_Wechsel_Notify

define BG_Wechsel_Notify notify BG_Wechsel_Notify {\
my $hh = substr(sunset_rel(),0,2);;\
my $mm = substr(sunset_rel(),3,2);;\
my $ss = substr(sunset_rel(),6,2);;\
my $dauer=($hh*3600)+($mm*60)+$ss;;\
my $dauer_rel=$dauer/10;;\
my $schrittweite=$dauer_rel;;\
my $i=0;;\
while($i <= 10){\
if ($i > 0){$dauer_rel=$dauer_rel+$schrittweite};;\
my $m = int $dauer_rel / 60;;\
my $s = $dauer_rel - ($m * 60);;\
my $h = int $m / 60;;\
my $m = $m - ($h * 60);;\
my $timestring = sprintf("%%02d:%%02d:%%02d",$h,$m,$s);;\
fhem "define BG_Wechsel_$i at +$timestring attr Grundriss fp_backgroundimg sun$i";;\
$i++;;\
};;\
}


die Bilder tagsüber heißen sun0 bis sun9, das Bild, welches Nachts angzeigt wird sun10.

mod25

Hallo Nico,

ich finde dein Anhänge nicht mehr im Beitrag, würde mir gerne ein Bild von dem ganzen machen inkl. fhem.cfg damit ich eine herrangehensweise habe

VG,
mod25

Nico

Hallo mod25,

aus Datenschutz Bedenken habe ich die Bilder wieder herausgenommen.

Herangehensweise ist aber folgende:

1) man kann sich mit dem Programm SweetHome3D (gratis http://www.sweethome3d.com/de/index.jsp) schnell und einfach sein Haus/ seine Wohnung nachzeichnen.

2) man kann in SweetHome 3D die Ausrichtung der Wohnung (Kompass) und eine Uhrzeit angeben und damit ein Luftbild mit dem Sonnenstand berechnen lassen (höchste Qualität einstellen). Hiermit habe ich 10 Bilder erstellt (8 Uhr (war  etwa sonnenaufgang), 9 Uhr, etc., bis 18 Uhr (etwa Sonnenuntergang); kam halt so aus beim eingestellten Datum). Das Erstellen der Bilder dauert etwas...

3) die Bilder unter dem Namen sun0, sun1, etc. im Ordner fhem/www/images/default abspeichern

4) Floorplan zuerst definieren wie in commandref beschrieben, meiner heißt Grundriss (falls du keinen hast)

5) sunrise definieren wie in commandref beschrieben

6) korrigierten Code aus dem 2. post in fhem.cfg verwenden und schon wird bei sonnenaufgang sun0, nach 1/10 der Zeit bis Sonnenuntergang sun1, nach 2/10 der Zeit bis Sonnenuntergang sun2, etc... als Hintergrundbild im Floorplan dargestellt.


Der Sonnenstand wird also nicht wirklich von fhem berechnet, sondern wurde in sweethome3D berechnet, fhem lädt nur zum sonnenaufgang das bild sun0 als floorplan, am besten siehst du dir mal sweet home 3d zunächst an, dann wird die Vorgehensweise klar.

selfarian

Hi Nico,

danke für den Code, gefällt mir sehr gut.
Von dem Feature aus SweetHome 3D wusste ich noch garnichts. Ich hatte das Tool mal vor einiger Zeit eingesetzt und hatte eigentlich mehr Probleme damit, als das es mir was geholfen hat. Wobei der Support damals echt 1a war. Mittlererweile ist die Software ja schon sehr ausgereift und hat nichtmal Probleme Split-Level darzustellen.

Was mich noch interessieren würde:
Verschwinden die "at" wieder, nachdem sie ausgelöst werden?
Mir war beim Testen nur aufgefallen (habe den Trigger manuell angestoßen), das er darüber schimpft, das die "at" schon definiert sind und habe mir für den Test mit einem delete vor der definition beholfen.

Außerdem bekomme ich die Fehlermeldung im Log:
"my" variable $m masks earlier declaration in same scope at (eval 35) line 1.
Use of uninitialized value $off in numeric gt (>) at ./FHEM/01_FHEMWEB.pm line 1665.
Use of uninitialized value $off in concatenation (.) or string at ./FHEM/01_FHEMWEB.pm line 1669.

Wobei ich mir bei letzterer nicht 100% sicher bin, ob sie mit der Änderung zusammenhängt.

Vielleicht kann mir da jemand ja noch weiterhelfen ;) Funktioniert zwar, aber Fehlermeldungen sind nie schön ;)

Gruß,
Selfarian
RasPi mit HMLAN, 5x HM-SEC-SC, HM LED16 als Alarmanlagendisplay, HM-TC-IT-WM-W-EU, 4x HM-CC-RT-DN, 1x HM PBU, 1x HM PBI-4

Nico

Hallo Selfarian,

den Code habe ohne tiefergehende Kenntnisse zusammengeschustert.

Ich meine jedoch, dass bei mir im event monitor mit dem auslösen des at gleichzeitig ein" global deleted at " kommt. Werde mal darauf achten.


Ich kann mir meinen Log auch mal ansehen bzgl. der Fehlermeldungen, aber ich bin wirklich nur Laie in diesen Dingen. War froh das es funktioniert ;)

Lg nico

Nico

also my $m wird in jeder Schleife neu definiert. Hier müssten die perl Profis mal helfen, ist es besser die Variablen vorher leer zu definieren so wie:

define BG_Wechsler at *{sunrise} trigger BG_Wechsel_Notify

define BG_Wechsel_Notify notify BG_Wechsel_Notify {\
my $hh = substr(sunset_rel(),0,2);;\
my $mm = substr(sunset_rel(),3,2);;\
my $ss = substr(sunset_rel(),6,2);;\
my $dauer=($hh*3600)+($mm*60)+$ss;;\
my $dauer_rel=$dauer/10;;\
my $schrittweite=$dauer_rel;;\
my $i=0;;\
my $m;;\
my $s;;\
my $h;;\
my $timestring;;\

while($i <= 10){\
if ($i > 0){$dauer_rel=$dauer_rel+$schrittweite};;\
$m = int $dauer_rel / 60;;\
$s = $dauer_rel - ($m * 60);;\
$h = int $m / 60;;\
$m = $m - ($h * 60);;\
$timestring = sprintf("%%02d:%%02d:%%02d",$h,$m,$s);;\
fhem "define BG_Wechsel_$i at +$timestring attr Grundriss fp_backgroundimg sun$i";;\
$i++;;\
};;\
}

??
Leider habe ich noch keine Zeit für Tests gehabt, werde ich morgen mal machen.
Behebt das deine Fehlermeldungen?

gruß nico

selfarian

Hallo,

ja, das sieht gut aus! Danke dir!
RasPi mit HMLAN, 5x HM-SEC-SC, HM LED16 als Alarmanlagendisplay, HM-TC-IT-WM-W-EU, 4x HM-CC-RT-DN, 1x HM PBU, 1x HM PBI-4