FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Thoffi1978 am 15 Dezember 2014, 14:27:48

Titel: 99_myUtils wird nicht geladen
Beitrag von: Thoffi1978 am 15 Dezember 2014, 14:27:48
Hallo,

ich finde den Fehler in der 99 my Utils nicht. Im FHEM log steht folgendes drinnen:

Zitat2014.12.15 14:21:40 1: reload: Error:Modul 99_myUtils deactivated:

Füge ich die 1; ans Ende kommt folgende Fehlermeldung:

Zitat2014.12.15 14:21:13 1: reload: Error:Modul 99_myUtils deactivated:
FritzBoxUtils defines neither package nor VERSION--version check failed at ./FHEM/99_myUtils.pm line 139.
BEGIN failed--compilation aborted at ./FHEM/99_myUtils.pm line 135.

Hier die 99_myUtils:
# #########################################################################
#  Global Variables and Defines
# #########################################################################
use constant { true => 1, false => 0 };
use constant { TRUE => 1, FALSE => 0 };
use constant { on => 1, off => 0 };
use constant { ON => 1, OFF => 0 };

my $myUtils_debug = false;


# #########################################################################
#  Init routine
# #########################################################################
sub myUtils_Initialize($$) {
    my ($hash) = @_;
   
    if( $myUtils_debug eq true ) {
fhem( "set myUtilsDebug true" );
    } else {
fhem( "set myUtilsDebug false" );
    }
}


# ------------------------------------------------------------------------
#  Function to turn the Debug on or off
#  Usage: ($success) = myUtils_Set_Debug( );
# ------------------------------------------------------------------------
sub myUtils_Set_Debug( ) {
    my $tmp_state = "";

    $tmp_state = $value{myUtilsDebug};

    Log 1, "myUtils_Set_Debug: Debug : .." . $tmp_state . "..";

    if( $tmp_state eq "true" ) {
$myUtils_debug = true;
Log 1, "myUtils_Set_Debug: Debugging eingeschaltet.";
    } else {
$myUtils_debug = false;
Log 1, "myUtils_Set_Debug: Debugging ausgeschaltet.";
    }

    return( true );
}


# #########################################################################
#  Wetterdatenauswertung
# #########################################################################

# **********************************************************************
#  Details aus Yahoo Wetter extrahieren
# **********************************************************************
sub Extract_Weather( ) {
    my $buf = ReadingsVal( "OD_Wetter", "temp_c", 20 );
    fhem( "set Aussentemperatur $buf" );

    $buf = ReadingsVal( "OD_Wetter", "humidity", 20 );
    fhem( "set Luftfeuchtigkeit $buf" );

    $buf = ReadingsVal( "OD_Wetter", "wind_speed", 20 );
    fhem( "set Windgeschwindigkeit $buf" );

    $buf = ReadingsVal( "Od_Wetter", "visibility", 20 );
    fhem( "set Sicht $buf" );

    $buf = ReadingsVal( "OD_Wetter", "wind_direction", 20 );
    fhem( "set Windrichtung $buf" );

    $buf = ReadingsVal( "OD_Wetter", "wind_chill", 20 );
    fhem( "set Windchill $buf" );

    $buf = ReadingsVal( "OD_Wetter", "pressure", 20 );
    fhem( "set Luftdruck $buf" );

    $buf = ReadingsVal( "OD_Wetter", "fc1_high_c", 20 );
    fhem( "set Tageshoechsttemperatur $buf" );

    $buf = ReadingsVal( "OD_Wetter", "fc1_low_c", 20 );
    fhem( "set Tagestiefsttemperatur $buf" );

    return;
}

# **********************************************************************
#  Entscheidung treffen, ob Sonnenschutz aktiv sein soll
# **********************************************************************
sub Decide_Sonnenschutz( ) {
    my $maxtemp = ReadingsVal( "Tageshoechsttemperatur", "State", 20 );
    my $curtemp = ReadingsVal( "Temperatur", "State", 20 );
   
    if( ( $maxtemp ge "28" ) || ( $curtemp ge "21" ) ) {
if( $myUtils_debug == true ) {
    Log 1, "Decide_Sonnenschutz: Max: $maxtemp C, Cur: $curtemp C";
}
# here we need to set the respective timers
# Beispielzimmer Rolladen auf 40% setzen
fhem( "define Jalousien_Seite_sun_auto at 11:00:03 set Jalousien_Seite 65" );
fhem( "attr Jalousien_Seite_sun_auto room _Zeit" );
fhem( "attr Jalousien_Seite_sun_auto group Jalousien_Seite,Sonnenschutz" );
# Beispielzimmer Rolladen wieder �ffnen
fhem( "define Jalousien_Seite_sun_auto at 17:30:03 set Jalousien_Seite on" );
fhem( "attr Jalousien_Seite_sun_auto room _Zeit" );
fhem( "attr Jalousien_Seite_sun_auto group Jalousien_Seite,Aufmachen" );

    }

}

###################################################
###     Spritpreisübersicht - Farbsortierung    ###
###################################################

sub Werte($$) {
  my ($name, $wert) = @_;
# Log(3,"$name $wert");
  if ($name eq "Diesel") {
    return 'style="color:red"' if($wert >= 1.39);
    return 'style="color:blue"' if(($wert >= 1.33) && ($wert < 1.39));
    return 'style="color:green;;font-weight:bold"' if($wert <= 1.32);
  }elsif ($name eq "SuperE10") {
    return 'style="color:crimson"' if($wert >= 1.70);
    return 'style="color:yellow"' if(($wert >= 1.55) && ($wert < 1.70));
    return 'style="color:lightgreen;;font-weight:bold"' if($wert < 1.55);
  }elsif ($name eq "SuperE5") {
    return 'style="color:red"' if($wert >= 1.59);
    return 'style="color:blue"' if(($wert >= 1.49) && ($wert < 1.59));
    return 'style="color:green;;font-weight:bold"' if($wert <= 1.48);
  } 
}

use FritzBoxUtils
;


Ich hoffe Ihr könnt mir weiterhelfen.

Vielen Dank schon mal.

Thoffi
Titel: Antw:99_myUtils wird nicht geladen
Beitrag von: Ralli am 15 Dezember 2014, 14:29:55
Schon hier rein geschaut?: http://www.fhemwiki.de/wiki/99_myUtils_anlegen

... so muss der grundsätzliche Aufbau aussehen. Du schließt z.B. nicht mit 1; ab.
Titel: Antw:99_myUtils wird nicht geladen
Beitrag von: Rohan am 15 Dezember 2014, 14:41:59
Zitat von: Ralli am 15 Dezember 2014, 14:29:55
...Du schließt z.B. nicht mit 1; ab.

Zitat... Füge ich die 1; ans Ende kommt folgende Fehlermeldung: ...

hmmm.... hat er doch, nur nicht im geposteten File.

Edith ergänzt (das obere war nur ein Schnellschuss ;) ):

Den Tipp mit dem Wiki-Artikel sollte der TE dennoch befolgen, denn deine 99_myUtils genügt nicht den Mindestanforderungen. Der im Wiki beschriebene Basis-Kopf fehlt (Grunddefinitionen). Zudem scheint mir das letzte

use FritzBoxUtils
;


"etwas" eigenartig. Ist dieses File zum Einbinden vorbereitet (bin aber Längen davon entfernt, das beurteilen zu können)?

Gruß
Thomas
Titel: Antw:99_myUtils wird nicht geladen
Beitrag von: Icinger am 15 Dezember 2014, 17:47:52
Zitat aus dem Einsteiger-PDF:

ZitatWollen Sie diese Routinen verwenden, müssen Sie das Laden dieser Datei auslösen durch
einen Eintrag in Ihrer 99_myUtils.pm. Tragen Sie dort zu Anfang ein:
use FritzBoxUtils;

Man beachte das "zu Anfang".....da steht nichts von "am Ende".

Und wie Rohan schon sagte:
ZitatDer im Wiki beschriebene Basis-Kopf fehlt (Grunddefinitionen)

Und natürlich noch die 1; am ende (oder meinetwegen auch "Cogito ergo sum;", was ja auch TRUE ist).

lg, Ici
Titel: Antw:99_myUtils wird nicht geladen
Beitrag von: Thoffi1978 am 16 Dezember 2014, 10:19:54
Hallo.
Vielen Dank für die Antworten.
Ich habe nun etwas ausprobiert und die myUtils wird auch geladen. Die FritzBoxUtils wird auch angesprochen.

Ich bekomme aber nun eine andere Fehlermeldung. Vielleicht kann man die auch ignorieren, das weiß ich aber nicht, ich weiß auch nicht genau was die Fehlermeldung bedeutet.
Hier nun einmal die jetzige myUtils:
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# #########################################################################
#  Global Variables and Defines
# #########################################################################
use constant { true => 1, false => 0 };
use constant { TRUE => 1, FALSE => 0 };
use constant { on => 1, off => 0 };
use constant { ON => 1, OFF => 0 };
use FritzBoxUtils;

my $myUtils_debug = false;


# #########################################################################
#  Init routine
# #########################################################################
sub myUtils_Initialize($$) {
    my ($hash) = @_;
   
    if( $myUtils_debug eq true ) {
fhem( "set myUtilsDebug true" );
    } else {
fhem( "set myUtilsDebug false" );
    }
}


# ------------------------------------------------------------------------
#  Function to turn the Debug on or off
#  Usage: ($success) = myUtils_Set_Debug( );
# ------------------------------------------------------------------------
sub myUtils_Set_Debug( ) {
    my $tmp_state = "";

    $tmp_state = $value{myUtilsDebug};

    Log 1, "myUtils_Set_Debug: Debug : .." . $tmp_state . "..";

    if( $tmp_state eq "true" ) {
$myUtils_debug = true;
Log 1, "myUtils_Set_Debug: Debugging eingeschaltet.";
    } else {
$myUtils_debug = false;
Log 1, "myUtils_Set_Debug: Debugging ausgeschaltet.";
    }

    return( true );
}


# #########################################################################
#  Wetterdatenauswertung
# #########################################################################

# **********************************************************************
#  Details aus Yahoo Wetter extrahieren
# **********************************************************************
sub Extract_Weather( ) {
    my $buf = ReadingsVal( "OD_Wetter", "temp_c", 20 );
    fhem( "set Aussentemperatur $buf" );

    $buf = ReadingsVal( "OD_Wetter", "humidity", 20 );
    fhem( "set Luftfeuchtigkeit $buf" );

    $buf = ReadingsVal( "OD_Wetter", "wind_speed", 20 );
    fhem( "set Windgeschwindigkeit $buf" );

    $buf = ReadingsVal( "Od_Wetter", "visibility", 20 );
    fhem( "set Sicht $buf" );

    $buf = ReadingsVal( "OD_Wetter", "wind_direction", 20 );
    fhem( "set Windrichtung $buf" );

    $buf = ReadingsVal( "OD_Wetter", "wind_chill", 20 );
    fhem( "set Windchill $buf" );

    $buf = ReadingsVal( "OD_Wetter", "pressure", 20 );
    fhem( "set Luftdruck $buf" );

    $buf = ReadingsVal( "OD_Wetter", "fc1_high_c", 20 );
    fhem( "set Tageshoechsttemperatur $buf" );

    $buf = ReadingsVal( "OD_Wetter", "fc1_low_c", 20 );
    fhem( "set Tagestiefsttemperatur $buf" );

    return;
}

# **********************************************************************
#  Entscheidung treffen, ob Sonnenschutz aktiv sein soll
# **********************************************************************
sub Decide_Sonnenschutz( ) {
    my $maxtemp = ReadingsVal( "Tageshoechsttemperatur", "State", 20 );
    my $curtemp = ReadingsVal( "Temperatur", "State", 20 );
   
    if( ( $maxtemp ge "28" ) || ( $curtemp ge "21" ) ) {
if( $myUtils_debug == true ) {
    Log 1, "Decide_Sonnenschutz: Max: $maxtemp C, Cur: $curtemp C";
}
# here we need to set the respective timers
# Beispielzimmer Rolladen auf 40% setzen
fhem( "define Jalousien_Seite_sun_auto at 11:00:03 set Jalousien_Seite 65" );
fhem( "attr Jalousien_Seite_sun_auto room _Zeit" );
fhem( "attr Jalousien_Seite_sun_auto group Jalousien_Seite,Sonnenschutz" );
# Beispielzimmer Rolladen wieder �ffnen
fhem( "define Jalousien_Seite_sun_auto at 17:30:03 set Jalousien_Seite on" );
fhem( "attr Jalousien_Seite_sun_auto room _Zeit" );
fhem( "attr Jalousien_Seite_sun_auto group Jalousien_Seite,Aufmachen" );

    }

}

###################################################
###     Spritpreisübersicht - Farbsortierung    ###
###################################################

sub Werte($$) {
  my ($name, $wert) = @_;
# Log(3,"$name $wert");
  if ($name eq "Diesel") {
    return 'style="color:red"' if($wert >= 1.39);
    return 'style="color:blue"' if(($wert >= 1.33) && ($wert < 1.39));
    return 'style="color:green;;font-weight:bold"' if($wert <= 1.32);
  }elsif ($name eq "SuperE10") {
    return 'style="color:crimson"' if($wert >= 1.70);
    return 'style="color:yellow"' if(($wert >= 1.55) && ($wert < 1.70));
    return 'style="color:lightgreen;;font-weight:bold"' if($wert < 1.55);
  }elsif ($name eq "SuperE5") {
    return 'style="color:red"' if($wert >= 1.59);
    return 'style="color:blue"' if(($wert >= 1.49) && ($wert < 1.59));
    return 'style="color:green;;font-weight:bold"' if($wert <= 1.48);
  } 
}
1;


und hier die Fehlermeldung/en:

Zitat2014.12.16 08:04:01 1: PERL WARNING: Subroutine myUtils_Initialize redefined at ./FHEM/99_myUtils.pm line 7.
2014.12.16 08:04:01 1: PERL WARNING: Subroutine myUtils_Initialize redefined at ./FHEM/99_myUtils.pm line 26.
2014.12.16 08:04:01 1: PERL WARNING: Subroutine myUtils_Set_Debug redefined at ./FHEM/99_myUtils.pm line 41.
2014.12.16 08:04:01 1: PERL WARNING: Subroutine Extract_Weather redefined at ./FHEM/99_myUtils.pm line 67.
2014.12.16 08:04:01 1: PERL WARNING: Subroutine Decide_Sonnenschutz redefined at ./FHEM/99_myUtils.pm line 101.
2014.12.16 08:04:01 1: PERL WARNING: Subroutine Werte redefined at ./FHEM/99_myUtils.pm line 127.
2014.12.16 08:04:01 3: set myUtilsDebug false : Please define myUtilsDebug first

Jetz schon mal ein großes Lob
Danke
Titel: Antw:99_myUtils wird nicht geladen
Beitrag von: betateilchen am 16 Dezember 2014, 10:31:51
die redefined Meldungen kannst Du alle ignorieren, die sind völlig normal, wenn ein bereits geladenes Modul nochmal geladen wird.

Zitat2014.12.16 08:04:01 3: set myUtilsDebug false : Please define myUtilsDebug first

Hier versuchst Du, einem Device einen Wert zuzuweisen, das zu diesem Zeitpunkt noch nicht definiert ist. Sowas darfst Du in die myUtils_Initialize() nicht einbauen.


Titel: Antw:99_myUtils wird nicht geladen
Beitrag von: ph1959de am 16 Dezember 2014, 12:41:09
Zitat von: betateilchen am 16 Dezember 2014, 10:31:51
die redefined Meldungen kannst Du alle ignorieren, die sind völlig normal, wenn ein bereits geladenes Modul nochmal geladen wird.

In dem Fall hier wird aber wohl myUtils_Initialize() wirklich mehrfach definiert. Auch wenn das vielleicht nicht wirklich ein Problem ist hier, weil der gewünschte Inhalt in der zweiten Definition steckt (ich vermute, das ist die Version, die "gewinnt"?), sollte man das aber doch wirklich vermeiden.
Titel: Antw:99_myUtils wird nicht geladen
Beitrag von: betateilchen am 16 Dezember 2014, 13:23:55
Stimmt schon, es macht überhaupt keinen Sinn, zwei gleichnamige Funktionen in einem Modul zu haben.

Aber da hier ohnehin ein User am Werk zu sein scheint, der sämtliche dokumentierte Hinweise zur Verwendung einer 99_myUtils.pm in den Wind zu schlagen scheint, kommt es darauf auch nicht mehr an :)
Titel: Antw:99_myUtils wird nicht geladen
Beitrag von: Icinger am 16 Dezember 2014, 13:27:09
if( ( $maxtemp ge "28" ) || ( $curtemp ge "21" ) )

Zahlen als String (->alphabeitsch) zu vergleichen ist auch nicht grade ideal.

lg, Ici
Titel: Antw:99_myUtils wird nicht geladen
Beitrag von: Thoffi1978 am 18 Dezember 2014, 15:49:40
Hallo Ihr,

ich gebe zu das ich mich versuche in das Thema einzulesen. Doch so manche Frage bleibt offen.
Jetzt weiß ich auch das die MyUtils zweimal "geladen" wird, doch wieso wurde leider nicht geschrieben.
ZitatZahlen als String (->alphabeitsch) zu vergleichen ist auch nicht grade ideal.
Ich habe den Code nur so kopiert, hat eigentlich auch funktioniert, doch wenn es eine bessere Version gibt, wäre ich auch über eine Antwort dankbar.
Mir als Anfänger ist grad nicht so klar wieso Zahlen als String nicht so ideal sind.
Hier habe ich leider kein Hinweis gefunden, das man das nicht so machen soll http://forum.fhem.de/index.php?topic=13586.0 (http://forum.fhem.de/index.php?topic=13586.0)

Vielen Dankfür Eure Unterstützung
Thoffi

Titel: Antw:99_myUtils wird nicht geladen
Beitrag von: Doggiebert am 18 Dezember 2014, 16:12:07
nö, das hast Du falsch verstanden - schau Dir Deine Datei mal genau an!
In deiner myUtils ist nun oben

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}
und etwas weiter unten
sub myUtils_Initialize($$) {
    my ($hash) = @_;
   
    if( $myUtils_debug eq true ) {
...


D.h. Du hast in Deiner Datei 2x die Funktion definiert, das ist einmal zuviel. Das passiert, wenn man einfach copy & paste aus dem Wiki macht, ohne nachzudenken...
die myUtils wird nicht 2x geladen.

Die Warnmeldungen der Art
Subroutine myUtils_Set_Debug redefined
kommen daher, dass Du die Datei vermutlich manuell über reload neu geladen hast - das ist aber unkritisch (eine "Warning" eben); beim Neuladen einer Funktion gewinnt immer die zuletzt geladene. Die Warnmeldung bekommst Du nicht, wenn Du FHEM neu startest.

Den Hinweis von Icinger kannst Du erstmal ignorieren. Perl konvertiert von selbst zwischen String und Zahl. Sauberer ist's natürlich, wenn man mit Zahlen rechnet, diese auch als solche zu schreiben, d.h. nicht "28" sondern 28. Wenn Du Programmiereinsteiger bist, kannst ja mal z.B. unter http://www.perlboard.de/perlguide/Kap02.html (http://www.perlboard.de/perlguide/Kap02.html) nachlesen.