FHEM Forum

FHEM => fhem-users => Thema gestartet von: Guest am 27 September 2011, 17:06:07

Titel: FB7270: Wheater und Sunrise
Beitrag von: Guest am 27 September 2011, 17:06:07
Originally posted by: <email address deleted>

Hallo,
hat jemand bereits die beiden oben benannten Module auf der Fritzbox
7270 am laufen?
Genauer ... in welcher Perl-Variante sind die Module a + b integreirt?
a) DateTime::Event::Sunrise perl modul
b) Weather::Google
Alternativ die Frage wie bekomme ich Sie in der FB7270 integriert?

Danke für euren Support.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: FB7270: Wheater und Sunrise
Beitrag von: rudolfkoenig am 27 September 2011, 17:18:09
                                                   

>a) DateTime::Event::Sunrise perl modul

Das zu installieren war mir vor 4 Jahren so umstaendlich, dass ich sunrise_el.pm gebaut habe.
Der wiederum hakt an dem in dem aktullen 7270-er perl nicht vorhandenen trigonometrischen Funktionen.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: FB7270: Wheater und Sunrise
Beitrag von: Guest am 01 Oktober 2011, 11:13:46
Originally posted by: <email address deleted>

So, hab jetzt die Routinen eingebaut.
Leider krieg ich immer noch den

Illegal division by zero at ./FHEM/99_SUNRISE_EL.pm

# Compute the Sun's apparent radius, degrees
  my $sradius = 0.2666 / $sr;

$sr scheint auf 0 zu stehen...
und das, obwohl meines Erachtens keine trigonometrischen Routinen mehr aufgerufen werden, da alle durch "eigsin, eigtan,...." ersetzt wurden.
Jemand ne Idee?

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: FB7270: Wheater und Sunrise
Beitrag von: Guest am 02 Oktober 2011, 13:14:33
Originally posted by: <email address deleted>

Hallo Tom,

ich finde es super, dass du dich des Themas angenommen hast.
Danke für deine Unterstützung.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: FB7270: Wheater und Sunrise
Beitrag von: Guest am 02 Oktober 2011, 17:39:09
Originally posted by: <email address deleted>

Danke für Deine moralische Hilfe..

Bin ein Stückchen weiter....

Die Funktion sqrt kennt die FB wohl auch nicht. Da hab ich noch ein bisschen
zu arbeiten; und was kommt als nächstes?

Bin mir nicht sicher, dass ich das hinkrieg; Vielleicht muss man doch über
Wertetabelle gehen mit einigen vordefinierten Werten für mittlere Breiten
(30 - 60 Grad). Da beissts aber mit meinen Perl-Kenntnissen aus.

Na ja, ich mach mich mal an die numerische Berechnung der Wurzel...

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: FB7270: Wheater und Sunrise
Beitrag von: Guest am 05 Oktober 2011, 11:28:12
Originally posted by: <email address deleted>

So, die Routine laeuft ohne Fehlermeldung durch. Leider sind die Ergebnisse
noch etwas unsinnig.
Habe bisher alle trig. Fubnktionen ersetzt, die "hoch"-Funktion durch
Multiplikationen ersetzt, und die Wurzel selbst iteriert.
Offensichtlich sind in der Funktion aber noch weitere, der FB7270 unbekannte
Funktionen verbaut.
Im Moment krieg ich als Sunrise 2 Uhr irgendwas und als Sunset 12 Uhr
irgendwas. Das kommt leider nicht hin...
Vielleicht kann sich ja noch jemand an die anderen Probleme machen...
Hier noch die Wurzelfunktion:

sub eigsqrt($)
{
    my ($wert) = @_;
    my $wurzel = 1;
    my $startwert = $wert;
    if ($wert > 2) {
        $startwert = $wert / 2;
        }
    elsif ($wert > 90000) {
        $startwert = $wert /300;
        }
    $wurzel = ($startwert + $wert / $startwert) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
return $wurzel;
}

Und bei den trigonometrischen Funktionen das "**" (also "hoch") durch
entsprechende Multiplikationen ersetzen!

Viel Erfolg und bitte um Nachricht, wenn jemand weiterkommt!

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: FB7270: Wheater und Sunrise
Beitrag von: Guest am 14 Oktober 2011, 10:11:22
Originally posted by: <email address deleted>

Hier nochmal meine aktuellen Routinen:

sub eigsqrt($)
{
    my ($wert) = @_;
    my $wurzel = 1;
    my $startwert = $wert;
    if ($wert > 2) {
        $startwert = $wert / 2;
        }
    elsif ($wert > 90000) {
        $startwert = $wert /300;
        }
    $wurzel = ($startwert + $wert / $startwert) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
return $wurzel;
}

sub
eigsin($)
{
    my ($winkel) = @_;
    my $winkelkurz = $winkel - int($winkel/2/3.1415926)*2*3.1415926;
    my $vz = 1;
    if (abs($winkelkurz) > 3.1415926) {
        $vz = -1;
        $winkelkurz = $winkelkurz - 3.1415926
        }
    my $sinuswert = $vz * ($winkelkurz - $winkelkurz*$winkelkurz*$winkelkurz
/ 6 + $winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz / 120 -
$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz
/ 5040 +
$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz
/ 362880);
    if (abs($sinuswert) < 0.001) {
        $sinuswert =0;
        }
    return $sinuswert;
}

sub
eigcos($)
{
    my ($winkel) = @_;
    my $coswert = eigsin($winkel + 3.1415926 / 2);
    return $coswert;
}

sub
eigtan($)
{
    my ($winkel) = @_;
    my $tanwert = eigsin($winkel) / eigcos($winkel);
    return $tanwert;
}

sub
eigasin($)
{
    my ($wert) = @_;
    my $winkel =
$wert+2/4/3*$wert*$wert*$wert+24/16/4/5*$wert*$wert*$wert*$wert*$wert+720/64/36/7*$wert*$wert*$wert*$wert*$wert*$wert*$wert+40320/256/24/24/9*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert;
    return $winkel;
}

sub eigatan($)
{
    my ($wert) = @_;
    my $winkel = $wert - 1 / 3 * $wert*$wert*$wert + 1 / 5 *
$wert*$wert*$wert*$wert*$wert - 1 / 7 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert + 1 / 9 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert - 1 / 11 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert + 1 / 13 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert
- 1 / 15 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert
+ 1 / 17 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert
- 1 / 19 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert;
    return $winkel;
}

sub eigacos($)
{
    my ($wert) = @_;
    my $winkel = 3.1415926 / 2 - eigasin($wert);
    return $winkel;
}

sub eigatan2($$)
{
    my ($werty, $wertx) = @_;
    if ($wertx > 0) {
        return eigatan($werty / $wertx);
    }    
    elsif ($werty >= 0 and $wertx < 0) {    
         return 3.1415926 + eigatan($werty / $wertx);
    }    
    elsif ($wertx < 0 and $werty < 0) {    
         return -3.1415926 + eigatan($werty / $wertx);
    }    
    elsif ($werty > 0 and $wertx = 0) {    
         return 3.1415926 / 2;
    }    
    elsif ($werty < 0 and $wertx = 0) {    
         return -3.1415926 / 2;
    }    
}

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: FB7270: Wheater und Sunrise
Beitrag von: Guest am 14 Oktober 2011, 17:07:48
Originally posted by: <email address deleted>

Cool ... super wenn es bei dir läuft))) .. und danke für die
Initiative!

Ich habe das folgende wie du sagst zusammengebaut und in die aktuelle
99_SUNRICE_EL.pm reinkopiert.


sub
_days_since_2000_Jan_0($$$)
{
  my ($y, $m, $d) = @_;
  my @mn = (31,28,31,30,31,30,31,31,30,31,30,31);

  my $ms = 0;
  for(my $i = 0; $i < $m-1; $i++) {
    $ms += $mn[$i];
  }
  my $x = ($y-2000)*365.25 + $ms + $d;
  $x++ if($m > 2 && ($y%4) == 0);
  return int($x);
}

...


sub eigsqrt($);
sub eigsin($);
sub eigcos($);
sub eigtan($);
sub eigasin($);
sub eigatan($);
sub eigacos($);
sub eigatan2($$);


sub eigsqrt($)
{
    my ($wert) = @_;
    my $wurzel = 1;
    my $startwert = $wert;
    if ($wert > 2) {
        $startwert = $wert / 2;
        }
    elsif ($wert > 90000) {
        $startwert = $wert /300;
        }
    $wurzel = ($startwert + $wert / $startwert) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
    $wurzel = ($wurzel + $wert / $wurzel) / 2;
return $wurzel;

}

sub
eigsin($)
{
    my ($winkel) = @_;
    my $winkelkurz = $winkel - int($winkel/2/3.1415926)*2*3.1415926;
    my $vz = 1;
    if (abs($winkelkurz) > 3.1415926) {
        $vz = -1;
        $winkelkurz = $winkelkurz - 3.1415926
        }
    my $sinuswert = $vz * ($winkelkurz - $winkelkurz*$winkelkurz*
$winkelkurz
/ 6 + $winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz /
120 -
$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*
$winkelkurz*$winkelkurz
/ 5040 +
$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz*
$winkelkurz*$winkelkurz*$winkelkurz*$winkelkurz
/ 362880);
    if (abs($sinuswert) < 0.001) {
        $sinuswert =0;
        }
    return $sinuswert;

}

sub
eigcos($)
{
    my ($winkel) = @_;
    my $coswert = eigsin($winkel + 3.1415926 / 2);
    return $coswert;

}

sub
eigtan($)
{
    my ($winkel) = @_;
    my $tanwert = eigsin($winkel) / eigcos($winkel);
    return $tanwert;

}

sub
eigasin($)
{
    my ($wert) = @_;
    my $winkel =
$wert+2/4/3*$wert*$wert*$wert+24/16/4/5*$wert*$wert*$wert*$wert*$wert
+720/64/36/7*$wert*$wert*$wert*$wert*$wert*$wert*$wert
+40320/256/24/24/9*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*
$wert;
    return $winkel;

}

sub eigatan($)
{
    my ($wert) = @_;
    my $vz = 0;

    if ($wert < -1) {
        $wert = 1 / $wert;
        $vz = -1;
        }
    if ($wert > 1) {
        $wert = 1 / $wert;
        $vz = 1;
        }

    my $winkel = ($vz * 3.1415926 / 2) - ($wert - 1 / 3 * $wert*$wert*
$wert* + 1 / 5 *
$wert*$wert*$wert*$wert*$wert* - 1 / 7 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert* + 1 / 9 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert* - 1 / 11 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert* +
1 / 13 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*
$wert*$wert* - 1 / 15 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*
$wert*$wert*$wert*$wert* + 1 / 17 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*
$wert*$wert*$wert*$wert*$wert*$wert* - 1 / 19 *
$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*
$wert*$wert*$wert*$wert*$wert*$wert*$wert*$wert*);

    if ($vz == 0) {
        $winkel = -1 * $winkel;
        }

    return $winkel;

}

sub eigacos($)
{
    my ($wert) = @_;
    my $winkel = 3.1415926 / 2 - eigasin($wert);
    return $winkel;

}

sub eigatan2($$)
{
    my ($werty, $wertx) = @_;
    if ($wertx > 0) {
        return eigatan($werty / $wertx);
    }
    elsif ($werty >= 0 and $wertx < 0) {
         return 3.1415926 + eigatan($werty / $wertx);
    }
    elsif ($wertx < 0 and $werty < 0) {
         return -3.1415926 + eigatan($werty / $wertx);
    }
    elsif ($werty > 0 and $wertx = 0) {
         return 3.1415926 / 2;
    }
    elsif ($werty < 0 and $wertx = 0) {
         return -3.1415926 / 2;
    }

....

sub sind($) { sin( ( $_[0] ) * $DEGRAD ); }
sub cosd($) { cos( ( $_[0] ) * $DEGRAD ); }
sub tand($) { tan( ( $_[0] ) * $DEGRAD ); }
sub atand($) { ( $RADEG * atan( $_[0] ) ); }
sub asind($) { ( $RADEG * asin( $_[0] ) ); }
sub acosd($) { ( $RADEG * acos( $_[0] ) ); }
sub atan2d($$) { ( $RADEG * atan2( $_[0], $_[1] ) ); }

Beim Test mit { sunrise() } erhalte ich keine Uhrzeit ...
sondern:
Undefined subroutine &main::sunrise called at (eval 16) line 1.

Was habe ich falsch gemacht?

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: FB7270: Wheater und Sunrise
Beitrag von: Guest am 23 Oktober 2011, 10:41:12
Originally posted by: <email address deleted>

Hallo Peter,

sorry für die späte Antwort, war die ganze Woche weg.

Die Deklaration der "sub"-Routinen steht bei mir ganz oben, gleich unter
"sub sunrise_coord($$$);", also Zeile (ungefähr) 20 - 27.

Die Routinen selbst hab ich dann gleich unter

"sub
SUNRISE_EL_Initialize($)
{
  my ($hash) = @_;
}
"
gepackt, also VOR(!!!) "sub sr($$$$$$)",

Im Aufruf selbst

sub sind($) { sin( ( $_[0] ) * $DEGRAD ); }

musst Du natürlich den Aufruf "sin" durch den neuen Aufruf "eigsin"
ersetzen, also:
sub sind($) { eigsin( ( $_[0] ) * $DEGRAD ); }

Dito mit allen neuen Funktionen (also sqrt durch eigsqrt, tan durch eigtan,
usw.).

Nur dann rechnet er auch mit den neuen Routinen. Die trigonometrischen
Funktionen sind praktischerweise "alle auf einem Haufen", die
sqrt-Funktionen suchst Du am besten mit der Suchfunktion deines Editors um
sicher alle zu finden.

Komplettlisting will ich auf Grund eventueller Copyright-Probleme nicht
veröffentlichen.

Ich ruf das ganze mit {sunset_abs()} auf aus der Befehlszeile von fhem.

Sag Bescheid, wies läuft,

Gruss
Tom

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: FB7270: Wheater und Sunrise
Beitrag von: Guest am 07 November 2011, 19:55:43
Originally posted by: <email address deleted>

Hallo Tom,

sorry für die späte Antwort, habe nur mal kurz eine Klimaanlage
installiert :)

ich habe soweit alles umgesetzt wie oben beschrieben.
Wenn ich {sunset_abs()} abfrage erhalte ich folgende Fehlermeldung.

Undefined subroutine &main::sunset_abs called at (eval 66) line 1.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: Re: FB7270: Wheater und Sunrise
Beitrag von: rudolfkoenig am 07 November 2011, 23:16:00
                                                   

> Undefined subroutine &main::sunset_abs called at (eval 66) line 1.

Und was steht im fhem-log?

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: FB7270: Wheater und Sunrise
Beitrag von: Guest am 08 November 2011, 12:49:13
Originally posted by: <email address deleted>

Mit dem "neuen Perl" sollte es doch auch ohne meine Verrenkungen
funktionieren, oder?

http://groups.google.com/group/fhem-users/browse_thread/thread/e2f5730f2b9650fd

Ansonsten wirklich mal ins Log schauen; vielleicht fehlt nur irgendwo ne
Klammer, oder so.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: FB7270: Wheater und Sunrise
Beitrag von: Guest am 08 November 2011, 17:31:33
Originally posted by: <email address deleted>

Hallo Tom,

danke. Heute habe ich das neue Perl ans laufen bekommen. Damit geht's
jetzt ...

Ich hatte es aber aus Interesse doch noch mal probiert ... bis ich
dann nach 2 Stunden genug hatte.

@Rudolf ... das log hat mir nicht wirklich weitergeholfen. Es waren
zuviele errors weshalb das Modul nicht geladen wurde.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: FB7270: Wheater und Sunrise
Beitrag von: Guest am 14 Oktober 2011, 11:31:47
Originally posted by: <email address deleted>

Und noch ein update zur atan-routine:

Damit bin ich (zur jetzigen Jahreszeit auf Münchner Breite) schon auf eine
knappe halbe Stunde genau...
($altit auf 0 gesetzt! zum Vergleich mit "offiziellen" Quellen.).

sub eigatan($)
{
    my ($wert) = @_;
    my $vz = 0;

    if ($wert < -1) {
        $wert = 1 / $wert;
        $vz = -1;
        }
    if ($wert > 1) {
        $wert = 1 / $wert;
        $vz = 1;
        }
       
    my $winkel = ($vz * 3.1415926 / 2) - ($wert - 1 / 3 * $wert**3 + 1 / 5 *
$wert**5 - 1 / 7 * $wert**7 + 1 / 9 * $wert**9 - 1 / 11 * $wert**11 + 1 / 13
* $wert**13 - 1 / 15 * $wert**15 + 1 / 17 * $wert**17 - 1 / 19 * $wert**19);
   
    if ($vz == 0) {
        $winkel = -1 * $winkel;
        }
       
    return $winkel;
}

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Titel: Re: FB7270: Wheater und Sunrise
Beitrag von: Guest am 14 Oktober 2011, 11:35:37
Originally posted by: <email address deleted>

... Und wenn man jetzt noch die "**" durch die Multiplikationen ersetzt (wie
aus dem vorletzten Listing), dann passts!!!

Problem - glaube ich - hiermit gelöst!

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com