Da ich der "Verursacher" dieses Boards bin, gleich einmal einen Tipp:
Erstellt man eine neue Funktion möchte man auch prüfen, dass alles so funktioniert wie man es gerne hätte.
Dazu werden folgende Möglichkeiten in Fhem bereitgestellt:
https://wiki.fhem.de/wiki/DevelopmentModuleAPI#Loggingz.B.
Log($verbose, $message);
Das Problem ist, wenn man die Reihenfolge der Abläufe kontrollieren möchte, kann das schief gehen, da Fhem nur ein Prozess ist. D.h. die Ereignisse (auch Logs) werden nacheinander abgearbeitet. Dabei kann es vorkommen, das die gewünschte Reihenfolge im Logging nicht eingehalten wird.
Darüber bin ich bei meiner ersten myUtils-Funktion gestolpert.
Dank justme1968 habe ich bei mir eine Erinnerungslücke gefunden:

Da ich den Code über mehrere Tage kontrollieren wollte, habe ich FileLog benutzt, um die Logs in einer Datei übersichtlich auswerten zu können. Hier kommt es unter Umständen dazu, dass die Reihenfolge verwürfelt wird. Die Alternative mit Log() wollte ich aus den genannten Gründen nicht benutzen.
Dank Hilfe des Forums (u.a. CoolTux, Beta-User) ist der folgende Workaroud entstanden. Ein großes Dankeschön dafür.
Folgende beide Subs in myUtils anlegen (kann in einer myUtils-Datei erfolgen):
# Logdatei zum debuggen
#
# $file = name.log;
# debuglog("blabla",$file);
sub debuglog {
my $myState = shift // return; #Beta-User: Perl defined-or
my $file = shift // q{unnamed.log};
my $fileName = "/opt/fhem/log/$file";
if(open my $DATEI, q{>>}, $fileName) {
print ($DATEI Zeitstempel()."$myState\n");
return close ($DATEI);
} else {
return "Can't open $fileName: $!";
}
return;
}
sub Zeitstempel()
{
return strftime("%Y-%m-%d %H:%M:%S ", localtime());
}
Aufruf in der eigenen Sub:
my $file = "name.log"; # kann weggelassen werden, dann wird sie als unnamed.log angelegt
debuglog(" Text: $var", $file);
Die Datei wird dann unter /fhem/log automatisch angelegt.
Wenn man nun ein Filelog-Device anlegt und deaktiviert, kann man die Logdatei direkt in der Weboberfläche ansehen.
defmod log_Bewaesserung FileLog ./log/name.log xxx
attr log_Bewaesserung disable 1
Funktioniert der Code nach dem Debugging, möchte man evtl. das Logging wieder deaktivieren.
Dazu kann man die Zeilen löschen (empfehle ich nicht, evtl möchte man den Code später erweitern/ändern) oder auskommentieren.
Sind viele Log-Zeilen vorhanden, ist dies aufwändig...
Einfacher ist es, das Logging schaltbar zu gestalten.
Dazu legen wir eine weiter Variable in der eigenen Sub an und passen die Log-Zeile etwas an:
my $logging = 1 # es funktioniert 0/1, true/false
debuglog(" Text: $var", $file) if $logging;
Um nun das Logging abzuschalten, setzt man $logging auf 0.
Eine weiter Möglichkeit wäre, das Logging über ein Attribut im Device zu schalten.
Dazu legen wir im Device ein neues Attribut an:
attr <DEVICE> userattr mydebuglog:0,1
Das Attribut kann dann einfach gesetzt werden.
Im der Sub ändern wir die Zuweisung der Variablen folgendermaßen:
my $logging = AttrVal(<DEVICE>,'mydebuglog',1)
An die @Experten: falls es Verbesserungspotential gibt...