99_myUtils wird nicht geladen

Begonnen von Thoffi1978, 15 Dezember 2014, 14:27:48

Vorheriges Thema - Nächstes Thema

Thoffi1978

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

Ralli

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.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

Rohan

#2
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
Fhem auf Mini-ITX mit Celeron 2-Core, HMLAN (> 55 Devices), CUL (FS20 und EM), RFXtrx 433E, Arduino (einige DS18B20), RPi mit 1-Wire (DS2423 für S0-Signale, DS18B20+), RPi/Arduino mit MQ-5 und MQ-9 (CO- und CNG/LPG-Sensor), CO-20 IAQ Sensor

Icinger

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
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Thoffi1978

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

betateilchen

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.


-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ph1959de

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.
Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"

betateilchen

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 :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Icinger

if( ( $maxtemp ge "28" ) || ( $curtemp ge "21" ) )

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

lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Thoffi1978

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

Vielen Dankfür Eure Unterstützung
Thoffi


Doggiebert

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 nachlesen.
SW: FHEM 5.5, Raspian, XBMC, Testinstallation auf Win7
HW: Raspi B, 32GB SD, enocean Pi, RFXTRX433E, BSC - MwC-32, Onkyo TX-NR709, Samsung UE55F8090, Jung LS-Eno, permundo SmartPlug, KDG-FB 6490cable (ohne FHEM)