Moin
Mein erster Versuch, der gleich schief geht.
Ich habe mir eine 99_myBeaufortSkala.pm angelegt,
nur leider wird sie nicht unter Edit File Angezeigt.
Wenn ich 's unter dem Frontend tue bekomme ich diese Meldung.
Undefined subroutine &main::myBeaufortSkalat_Initialize called at fhem.pl line 1777.
Und wenn man ein reload 99_myBeaufortSkala.pm eingibt,kommt das.
syntax error at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 21, near "my "
Global symbol "$WindSt" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 21.
Global symbol "$WindBez" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 26.
Global symbol "$bwind" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 27.
Global symbol "$bwind" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 27.
Global symbol "$WindBez" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 28.
Global symbol "$bwind" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 29.
Global symbol "$bwind" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 29.
.
.
.
syntax error at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 84, near "}"
/opt/fhem//FHEM/99_myBeaufortSkala.pm has too many errors.
Was mach ich alles Falsch und könnt Ihr mir dabei Helfen?
ZitatWenn ich 's unter dem Frontend tue bekomme ich diese Meldung.
Wenn Du
was tust?
##############################################
# $Id: 99_myBeaufortSkala.pm
package main;
use strict;
use warnings;
use POSIX;
sub
myBeaufortSkala_Initialize($$)
{
my ($hash) = @_;
}
*** start your own code below this line
Und Deine vielen Fehlermeldungen kommen daher, dass Du hier (Zeilen 20+21)
my $WindBez = ""
my $WindSt=""
permanent das Semikolon am Zeilenende vergessen hast. Weiter hab ich mir Dein Coding jetzt nicht angeschaut.
Schlampig gearbeitet - und perl rächt sich logischerweise und konsequent durch Nichtfunktionieren.
---
ZitatUnd Deine vielen Fehlermeldungen kommen daher, dass Du hier (Zeilen 20+21)
my $WindBez = ""
my $WindSt=""
Da hast du vollkommen Recht, das war so und die Fehlermeldungen sind weg.
ZitatZitat:
Wenn ich 's unter dem Frontend tue bekomme ich diese Meldung.
Ich hatte diesen Code in der 99_myUtils eingegeben und mit Save as die Datei unter
neuen Namen gespeichert.
Und dann bekam ich die Fehlermeldung:
ZitatUndefined subroutine &main::myBeaufortSkalat_Initialize called at fhem.pl line 1777.
Angezeigt bekomme ich sie aber immer noch nicht unter Edit Files.
Ach so hatte die Dateirechte unter Windows den anderen angeglichen.
Moin
So das mit der eigenen Datei habe ich Aufgegeben.
Und alles in die 99_myUtils.pm geschrieben.
Nur leider bekomme ich einen Falschen Wert zurück.
Bei einem Wind von 0.8 bekomme ich einen Wert von 11 zurück
was eigentlich 0 sein müsste.
##########################################################################################################################
sub BeaufortStaerke()
{
my $bwind = ReadingsVal("device KS300","wind",0);
my $WindSt = "";
#################################################################
#Wind stärken Bezeichnung
if($bwind lt 1)
{ $WindSt = "0\n" };
if($bwind ge 1 || $bwind le 5)
{ $WindSt = "1\n" };
if($bwind ge 6 || $bwind le 11)
{ $WindSt = "2\n" };
if($bwind ge 12 || $bwind le 19)
{ $WindSt = "3\n" };
if($bwind ge 20 || $bwind le 28)
{ $WindSt = "4\n" };
if($bwind ge 29 || $bwind le 38)
{ $WindSt = "5\n" };
if($bwind ge 39 || $bwind le 49)
{ $WindSt = "6\n" };
if($bwind ge 50 || $bwind le 61)
{ $WindSt = "7\n" };
if($bwind ge 62 || $bwind le 74)
{ $WindSt = "8\n" };
if($bwind ge 75 || $bwind le 88)
{ $WindSt = "9\n" };
if($bwind ge 89 || $bwind le 102)
{ $WindSt = "10\n" };
if($bwind ge 103 || $bwind le 117)
{ $WindSt = "11\n" };
if($bwind ge 118)
{ $WindSt = "12\n" };
return $WindSt;
Was ist hier schon wieder Falsch?
1. Falsche Logik in Deinen Abfragen
|| bedeutet ein logisches ODER, was Du aber in Deinen Abfragen möchtest, ist ein logisches UND.
if($bwind ge 50 || $bwind le 61) { $WindSt = "7\n" };
Du möchtest doch wissen, ob die Windstärke größergleich 50 UND kleinergleich 61 ist. Also muss es heißen:
if($bwind ge 50 && $bwind le 61) { $WindSt = "7\n" };
2. falsche Vergleichsoperatoren
ge und le sind Vergleichsoperatoren für Strings, Du vergleichst aber numerische Zahlenwerte. Es müsste also so heißen:
if($bwind >= 50 && $bwind <= 61) { $WindSt = "7\n" };
3. viel übersichtlicher würde ich das Ganze so lösen
sub BeaufortStaerke()
{
my $bwind = int(ReadingsVal("device KS300","wind",0));
# Windstärken Bezeichnung
return "0\n" if($bwind < 1);
return "1\n" if($bwind ~~ [1..5]);
return "2\n" if($bwind ~~ [6..11]);
return "3\n" if($bwind ~~ [12..19]);
return "4\n" if($bwind ~~ [20..28]);
return "5\n" if($bwind ~~ [29..38]);
return "6\n" if($bwind ~~ [39..49]);
return "7\n" if($bwind ~~ [50..61]);
return "8\n" if($bwind ~~ [62..74]);
return "9\n" if($bwind ~~ [75..88]);
return "10\n" if($bwind ~~ [89..102]);
return "11\n" if($bwind ~~ [103..117]);
return "12\n" if($bwind > 117);
}
---
Zitat von: Michael schrieb am Sa, 07 September 2013 20:23Und dann bekam ich die Fehlermeldung:
[Undefined subroutine &main::myBeaufortSkalat_Initialize called at fhem.pl line 1777.
Da hattest Du beim Eingeben des Dateinamens einen Tippfehler gemacht, da ist nämlich ein t zuviel und dadurch stimmt der Dateiname nicht mit dem Namen der Initialize-Funktion überein.
Danke !!!
Mit betateilchen seiner großen Hilfe habe ich das in die 99_myUtils.pm aufgenommen.
#####################################################################################################################
# Eigen Device für den WindIndex
# Quelle : http://www.meteotest.ch/wetterprognosen/prognosen_schweiz/windtabelle
#
sub windIndex()
{
my $wI = int(ReadingsVal("DEVICE KS300","wind",0));
my $wIndex = "";
# Windstärken Bezeichnung
return $wIndex = "0\n" if($wI < 1);
return $wIndex = "1\n" if($wI ~~ [1..5]);
return $wIndex = "2\n" if($wI ~~ [6..11]);
return $wIndex = "3\n" if($wI ~~ [12..19]);
return $wIndex = "4\n" if($wI ~~ [20..28]);
return $wIndex = "5\n" if($wI ~~ [29..38]);
return $wIndex = "6\n" if($wI ~~ [39..49]);
return $wIndex = "7\n" if($wI ~~ [50..61]);
return $wIndex = "8\n" if($wI ~~ [62..74]);
return $wIndex = "9\n" if($wI ~~ [75..88]);
return $wIndex = "10\n" if($wI ~~ [89..102]);
return $wIndex = "11\n" if($wI ~~ [103..117]);
return $wIndex = "12\n" if($wI > 117);
}
#####################################################################################################################
# Eigen Device für den WindText
# Quelle : http://www.meteotest.ch/wetterprognosen/prognosen_schweiz/windtabelle/
#
sub windText()
{
my $wT = int(ReadingsVal("DEVICE KS300","wind",0));
my $wText = "";
# Windstärken Bezeichnung
return $wText = "Windstille\n" if($wT < 1);
return $wText = "leiser Zug\n" if($wT ~~ [1..5]);
return $wText = "leichte Brise\n" if($wT ~~ [6..11]);
return $wText = "schwacher Wind\n" if($wT ~~ [12..19]);
return $wText = "mäßiger Wind\n" if($wT ~~ [20..28]);
return $wText = "frischer Wind\n" if($wT ~~ [29..38]);
return $wText = "starker Wind\n" if($wT ~~ [39..49]);
return $wText = "steifer Wind\n" if($wT ~~ [50..61]);
return $wText = "stürmischer Wind\n" if($wT ~~ [62..74]);
return $wText = "Sturm\n" if($wT ~~ [75..88]);
return $wText = "schwerer Sturm\n" if($wT ~~ [89..102]);
return $wText = "orkanartiger Sturm\n" if($wT ~~ [103..117]);
return $wText = "Orkan\n" if($wT > 117);
}
Und das ist in der fhem.cfg bzw in einer include *.cfg
#################################################################
###### WindIndex nach
#
define updateWindIndex at +*00:03:00 {my $wIndex = $defs{DEVICE KS300};;\
readingsSingleUpdate($wIndex,"windIndex", windIndex(), 1) if( defined($wIndex) );;}
attr updateWindIndex verbose 0
#################################################################
# WindText nach
#
define updateWindText at +*00:03:00 {my $wText = $defs{DEVICE KS300};;\
readingsSingleUpdate($wText,"windText", windText(), 1) if( defined($wText) );;}
Wer es gebrauchen kann bitte sehr.
ich verstehe zwar nicht, was Du Dir da für ein kompliziertes Coding zusammengeschräubelt hast, aber meines Erachtens gibt es da erhebliches Optimierungspotenzial...
Hallo zusammen,
ich habe auch Fragen zu meiner 99_myUtils.pm. Im Logfile erhalte ich keine Fehlermeldungen aber im Putty-Fenster.
Diese Meldungen kommen, wenn ich mit dem FHEM-internen Editor die Datei aufrufe oder wenn ich reload 99_myUtils.pm eingebe.
Subroutine myUtils_Initialize redefined at ./FHEM/99_myUtils.pm line 12
Subroutine CallMonOn redefined at ./FHEM/99_myUtils.pm line 24
Subroutine FBCall redefined at ./FHEM/99_myUtils.pm line 32
Subroutine FBHangOn redefined at ./FHEM/99_myUtils.pm line 49
Subroutine addLog redefined at ./FHEM/99_myUtils.pm line 63
Subroutine Info_LED redefined at ./FHEM/99_myUtils.pm line 76
Die gemeldeten Zeilen-Nr. bezeichnen jeweils die Zeile mit der "{" hinter dem Aufruf der Subroutine. Meine 99_Utils.pm sieht so aus:##############################################
# $Id: 99_myUtils.pm 1932 2013-06-06 Harald $
package main;
use strict;
use warnings;
use POSIX;
sub myUtils_Initialize($$)
{
my ($hash) = @_;
}
#
###################################################################
#
# Telefone der FB klingeln beim Betätigen der Türklingel
#
# wird aufgerufen durch:
# define Klingel1_on notify Klingel1:on {FBCall("**701")}
#
sub CallMonOn()
{
qx (echo '#96*5*' | nc 127.0.0.1 1011);
}
#
#
sub FBCall($)
{
my ($callnr) = @_;
$callnr = "ATP3 ATDT ".$callnr."";
my $ret = "ATD: " . `echo $callnr | nc 127.0.0.1 1011`;
#
# explanation of next line:
# =~ binds $ret to regular expression
# s ... search
# [\r\n]* ... all CR, LF
# ,, ... replace by nothing
# g ... global replace
#
$ret =~ s,[\r\n]*,,g; # remove CR from return string
InternalTimer(gettimeofday()+8, "FBHangOn","0", 0);
}
sub FBHangOn($)
{
my $ret = "ATH: " . `echo "ATH0" | nc 127.0.0.1 1011`;
$ret =~ s,[\r\n]*,,g;
}
#
#### Log-Abriss vermeiden
# called by
# define addLog notify addLog {addLog("ez_Aussensensor","state");addLog("ez_FHT","actuator");\
# addLog("MunichWeather","humidity");addLog("MunichWeather","pressure");\
# addLog("MunichWeather","temperature");addLog("MunichWeather","wind_chill");}
# define a_midnight1 at *23:59 trigger addLog
# define a_midnight2 at *00:01 trigger addLog
sub addLog($$)
{
my ($logdevice, $reading) = @_; # device and reading to be used
my $logentry = ReadingsVal($logdevice,$reading,"addLog: invalid reading");
if ($reading =~ m,state,i) {
fhem "trigger $logdevice $logentry << addLog";
} else {
fhem "trigger $logdevice $reading: $logentry << addLog";
}
}
#
##################################################################
#
sub Info_LED($)
{
my $current = $_[0];
if ($current eq "on") {
$current = "off";
qx(echo 7,1 >/var/led);
} else {
$current = "on";
qx(echo 7,2 >/var/led);
}
fhem("set blink.state $current");
}
#
##################################################################
1;
Es wäre toll, wenn mir jemand sagen könnte, was da falsch ist.
Herzlichen Dank schonmal im Voraus und viele Grüße
Harald
es ist nichts falsch. wenn das file mit reload neu geladen wird werden ja die gleichen funktionen von mal zuvor überschrieben. deshalb die meldung redfined.
das ist so lange ok wie nur diese meldungen kommen und du nicht aus versehen routinen aus anderen modulen überschreibst :)
gruss
andre
Besten Dank andre für die Erläuterungen. Ich bin auch nicht faul gewesen und habe auch andere Dateien ausprobiert. Da habe ich mir schon so etwas ähnliches gedacht. Vielen Dank jedenfalls für Deine Ausführungen und Bestätigung meiner Vermutung.
Schönes Wochenende und viele Grüße
Harald
Achja, eine Frage habe ich doch noch: Ist es so, dass wenn man z.B. 99_myUtils.pm mittels des internen Editors
aufruft und dann abspeichert, automatisch ein reload gestartet wird? Wenn ja, verstehe ich auch, warum dabei die "redefined"-Meldungen kommen.