Hallo,
ich habe meine ersten Schritte mit FHEM jetzt getätigt. Leider gelingt es mir nicht eine eigene Datei 99_myUtils.pm funktionsfähig zu erstellen.
Ich bin wie in der WIKI beschrieben vorgegangen und habe eine Datei "99_myUtils.pm" im angelegt. Diese befindet sich auf meiner Fritzbox 7390 im Verzeichnis "FHEM" in welchen auch die anderen PM-Dateien liegen.
Der Inhalt besteht aus:
#####################
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
1;
Beim abspeichern dieser kommt der Fehler:
Undefined subroutine &main::MyUtils_Initialize called at fhem.pl line 1591.
Im Log-File:
Subroutine myUtils_Initialize redefined at ./FHEM/99_myUtils.pm line 8.
Was mache ich falsch, bzw. wo sollte ich nach Fehlern suchen?
Gruss Udo
Hardware/Software
Fritzbox 7390 Fhem info:
Release : 5.3
Branch : DEVELOPMENT
OS : linux
Arch : mips-linux
Perl : v5.12.2
Defined modules:
CUL_HM : 28
FHEMWEB : 7
FileLog : 29
HMLAN : 1
autocreate : 1
dummy : 1
notify : 2
telnet : 1
Defined models per module:
CUL_HM : HM-CC-TC,HM-CC-VD,HM-LC-SW2-FM,HM-LC-SW4-DR
Hi!
1. Lösche einfach zunächst deine selbst angelegte Datei.
2. Öffne die vorhandene 99_Utils.pm
3. Speichere sie mit "save as" mit 99_myUtils.pm
4. Öffne die Datei 99_myUtils wieder
5. Ändere in der Datei Utils_Initialize($$) in myUtils_Initialize($$)
6. Die dazwischen liegenden Subroutinen löschen (die "1;" belassen!!!) und durch eigene ergänzen Subroutinen ergänzen.
Klappt es dann?
MfG, MisterEltako.
Hallo,
Danke für die Antwort, aber ich komme jetzt erst gerade zum Probieren.
Ich bin nun nach obiger Anleitung vorgegangen
Bei dem folgenden Inhalt kommt wieder eine Fehlermeldung:
##############################################
# $Id: 99_Utils.pm 1932 2012-10-06 20:15:33Z ulimaass $
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
1;
Fehlermeldung: Illegal declaration of subroutine main::myUtils_Initialize at ./FHEM/99_myUtils.pm line 13.
Ergänzt man noch einen Eintrag wie in der Wiki:
##############################################
# $Id: 99_Utils.pm 1932 2012-10-06 20:15:33Z ulimaass $
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
1;
dann Fehlermeldung: Undefined subroutine &main::MyUtils_Initialize called at fhem.pl line 1591.
Führt man einen Reload aus "reload 99_myUtils.pm" kommt Fehler "Undefined subroutine &main::MyUtils_Initialize called at fhem.pl line 1591."
Im Log-File steht:
Subroutine myUtils_Initialize redefined at ./FHEM/99_myUtils.pm line 11.
Irgendwie komme ich nicht weiter. Benötige nochmal eine Tipp wo ich suchen muss.
Gruss Udo
Hallo,
mit welchem Programm bearbeitest du deine Files?
Nicht das dir einen Programm einen Steuercode unterjubelt mit dem fhem nichts anfangen kann.
Nur weil man im Code nichts sieht heisst es nicht das nichts da ist ;-)
Grüße
Edith: Korrektur
Hallo,
gleich im Firefox in Edit Files.
Gruss udo
Hallo,
ich habe noch etwas probiert. Jetzt kommt kein Fehler mehr. Die Ursache war mal wieder die Groß und Kleinschreibung scheinbar. Meine wenigen Unix-Kenntnisse sagten mir das dies ja bei Unix eine Rolle spielt wo es bei Windows nicht so drauf an kommt.
Also habe ich folgende Änderungen vorgenommen:
##############################################
# $Id: 99_Utils.pm 1932 2012-10-06 20:15:33Z ulimaass $
package main;
use strict;
use warnings;
use POSIX;
sub
MyUtils_Initialize($$)
{
my ($hash)=@_;
}
1;
Das "M" bei MyUtils_Initialize($$) groß geschrieben und im Dateinamen 99_myUtils.pm jetzt in 99_MyUtils.pm geändert.
Jetz kommt keine Fehlermeldung beim Abspeichern.
Kann mir jemand bestätigen, dass dies absolut entscheidend ist. Falls dies so sei müsste die Wiki "http://www.fhemwiki.de/wiki/99_myUtils_anlegen#Eine_neue_Programmdatei_erzeugen (//www.fhemwiki.de/wiki/99_myUtils_anlegen#Eine_neue_Programmdatei_erzeugen)" entsprechend angepasst werden, denn dort wird es klein geschrieben.
Gruss Udo
Hallo,
sorry. Kann ich nicht bestätigen.
Ich hab grad heute auf meinen RasPi die 99_myUtils.pm bearbeitet und diese ist ein kleines bischen umfangreicher als die "leere" 99_myUtils.pm
und das abspeichern verlief ohne Fehlermeldung und die Sub`s darin werden auch einwandfrei ausgeführt.
Ich kann meine 99_myUtils.pm gerne mal posten wenn gewünscht.
Grüße
Edith: Das m wurde absichtlich als m und nicht als M geschrieben.
Hallo Puschel74,
Ja bitte die 99_myUtils.pm mal posten.
Gruss Udo
Hallo und Guten morgen,
war gestern wohl doch schon etwas zu spät für meine müden Augen.
Ich hab grad gesehen das meine datei doch
99_MyUtils.pm heisst.
Also doch grosses M und kein m - Asche auf mein Haupt.
Wer lesen kann ist klar im Vorteil - wenn er das gelesene dann auch noch versteht.
Hier aber dennoch mal der Inhalt meiner 99_Mutils.pm
##############################################
# $Id: 99_Utils.pm 1099 2011-11-12 07:53:34Z rudolfkoenig $
package main;
use strict;
use warnings;
use POSIX;
sub
MyUtils_Initialize($$)
{
my ($hash) = @_;
}
######## DebianMail Mail auf dem RPi versenden ############
sub
DebianMail
{
my $rcpt = shift;
my $subject = shift;
my $text = shift;
my $ret = "";
my $sender = "xxx.yyy\@zzz.de";
my $konto = "aaa.bbb\@kabelbw.de";
my $passwrd = "abcde";
my $provider = "smtp.hhh.de";
Log 1, "sendEmail RCP: $rcpt";
Log 1, "sendEmail Subject: $subject";
Log 1, "sendEmail Text: $text";
$ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=no);
$ret =~ s,[\r\n]*,,g; # remove CR from return-string
Log 1, "sendEmail returned: $ret";
}
# sub fb_mail {
# my $rcpt = $_[0];
# my $subject = $_[1];
# my $text = $_[2];
# system("echo \"$text\" > fhem_nachricht.txt");
# system("mailer send -i 'fhem_nachricht.txt' -s \"$subject\" -t \"$rcpt\"");
# system("rm fhem_nachricht.txt");
# }
#### 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");
# Log 1, "addLog: dev $logdevice, rdg $reading, log $logentry";
if ($reading =~ m,state,i) {
fhem "trigger $logdevice $logentry << addLog";
} else {
fhem "trigger $logdevice $reading: $logentry << addLog";
}
}
###################################################################################
# Adapted WeatherOutput from FHEMWEB
# Store weathericons in new subdir FHEM/weathericons
# Check comment 10 lines below to switch between google icons and local icons
# Include into fhem using
# define MyWeatherWeblink weblink htmlCode { WeatherAsHtmlLocal("MyWeatherName") }
sub WeatherAsHtmlLocal($) {
my ($d) = @_;
$d = "<none>" if(!$d);
return "$d is not a Weather instance<br>"
if(!$defs{$d} || $defs{$d}{TYPE} ne "Weather");
my $imgHome="http://www.google.com";
##########################
# to use google icons, comment line below and reload this program
# $imgHome="/fhem/weathericons"; #turn this line into a comment to use google icons
##########################
my $ret = "<table>";
my $icon = ReadingsVal($d, "icon", "na.png");
$icon =~ s,/ig/images/weather(.*)\.gif,$1\.png, if ($imgHome =~ m/fhem/);
$ret .= sprintf('<tr><td><span id="weathericon"><img src="%s%s"></span></td><td><span id="weathertext">%s<br>temp %s, hum %s, %s</span></td></tr>',
$imgHome, $icon,
ReadingsVal($d, "condition", ""),
ReadingsVal($d, "temp_c", ""), ReadingsVal($d, "humidity", ""),
ReadingsVal($d, "wind_condition", ""));
for(my $i=2; $i<=4; $i++) {
my $icon = ReadingsVal($d, "fc${i}_icon", "na.png");
$icon =~ s,/ig/images/weather(.*)\.gif,$1\.png, if ($imgHome =~ m/fhem/);
$ret .= sprintf('<tr><td><span id="weathericon"><img src="%s%s"></span></td><td><span id="weathertext">%s: %s<br>min %s max %s</span></td></tr>',
$imgHome, $icon,
ReadingsVal($d, "fc${i}_day_of_week", ""),
ReadingsVal($d, "fc${i}_condition", ""),
ReadingsVal($d, "fc${i}_low_c", ""), ReadingsVal($d, "fc${i}_high_c", ""));
}
$ret .= "</table></div>";
return $ret;
}
sub Untoggle($) {
my ($obj) = @_;
if (Value($obj) eq "toggle"){
if (OldValue($obj) eq "off") {
{fhem ("setstate ".$obj." on")}
}
else {
{fhem ("setstate ".$obj." off")}
}
}
else {
{fhem "setstate ".$obj." ".Value($obj)}
}
}
1;
Ich vermute mal das ich das eine oder andere noch zu viel drin habe aber so funktioniert zumindest alles - soweit ich das sehe.
Grüße
Hallo Puschel74,
Danke für die Bereitstellung. Es scheint jetzt bei mir zu funktionieren. Ich habe in der Datei bei mir Zeitprofile für die Thermostaten hinterlegt, diese wurden auch übertragen. Somit scheint alles in Ordnung zu sein. Es kommt auch beim Abspeichern keine Fehlermeldung mehr. Wenn ich die Datei extern bearbeite benutze ich "Notepad++".
Gruss Udo
Zitat von: UdoG schrieb am Fr, 08 März 2013 23:08Das "M" bei MyUtils_Initialize($$) groß geschrieben und im Dateinamen 99_myUtils.pm jetzt in 99_MyUtils.pm geändert.
Jetz kommt keine Fehlermeldung beim Abspeichern.
Kann mir jemand bestätigen, dass dies absolut entscheidend ist. Falls dies so sei müsste die Wiki "http://www.fhemwiki.de/wiki/99_myUtils_anlegen#Eine_neue_Programmdatei_erzeugen" entsprechend angepasst werden, denn dort wird es klein geschrieben.
Hi Udo,
die Gross/Kleinschreibung ist in unix/linus relevant.
Daher muss die Schreibweise im Dateinamen extakt der Schreibweise des Namens der Initialize-Routine entsprechen, incl. Groß/Kleinschreibung.
Gruß, Uli