diff --git a/CHANGED b/CHANGED index 90e35b750..b87d518d0 100644 --- a/CHANGED +++ b/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: 98_fhemdebug, to aid "Error: >< no TYPE" debugging. - feature: 70_Jabber Added possibility to change componentname via attr JabberDomain - feature: 93_DbRep: function readingRename added, delEntries is able to diff --git a/FHEM/98_fhemdebug.pm b/FHEM/98_fhemdebug.pm new file mode 100644 index 000000000..b1da9b1a0 --- /dev/null +++ b/FHEM/98_fhemdebug.pm @@ -0,0 +1,124 @@ +############################################## +# $Id$ +package main; + +use strict; +use warnings; + +my $fhemdebug_enabled; +my $main_callfn; + +sub +fhemdebug_Initialize($){ + $cmds{"fhemdebug"}{Fn} = "fhemdebug_Fn"; + $cmds{"fhemdebug"}{Hlp} = "{start|stop|status}"; +} + +sub +fhemdebug_Fn($$) +{ + my ($cl,$param) = @_; + + if($param eq "enable") { + return "fhemdebug is already enabled" if($fhemdebug_enabled); + local $SIG{__WARN__} = sub { }; + $main_callfn = \&CallFn; + *CallFn = \&fhemdebug_CallFn; + $fhemdebug_enabled = 1; + return undef; + + } elsif($param eq "disable") { + return "fhemdebug is already disabled" if(!$fhemdebug_enabled); + local $SIG{__WARN__} = sub { }; + *CallFn = $main_callfn; + $fhemdebug_enabled = 0; + return undef; + + } elsif($param eq "status") { + return "fhemdebug is ".($fhemdebug_enabled ? "enabled":"disabled"); + + } else { + return "Usage: fhemdebug {enable|disable|status}"; + } +} + +sub +fhemdebug_CheckDefs($@) +{ + my ($txt, $dev, $n) = @_; + foreach my $d (keys %defs) { + if(!defined($d)) { + Log 1, "ERROR: undef \$defs entry found ($txt $dev $n)"; + delete($defs{undef}); + next; + } + if($d eq "") { + Log 1, "ERROR: '' \$defs entry found ($txt $dev $n)"; + delete($defs{''}); + next; + } + if(ref $defs{$d} ne "HASH") { + Log 1, "ERROR: \$defs{$d} is not a HASH ($txt $dev $n)"; + delete($defs{$d}); + next; + } + if(!$defs{$d}{TYPE}) { + Log 1, "ERROR: >$d< has no TYPE, but following keys: >". + join(",", sort keys %{$defs{$d}})."<". + "($txt $dev $n)"; + delete($defs{$d}); + next; + } + } +} + +sub +fhemdebug_CallFn(@) +{ + #Log 1, "fhemdebug_CallFn $_[0] $_[1]; + + if(wantarray) { + fhemdebug_CheckDefs("before", @_); + no strict "refs"; + my @ret = &{$main_callfn}(@_); + use strict "refs"; + fhemdebug_CheckDefs("after", @_); + return @ret; + + } else { + fhemdebug_CheckDefs("before", @_); + no strict "refs"; + my $ret = &{$main_callfn}(@_); + fhemdebug_CheckDefs("after", @_); + use strict "refs"; + return $ret; + + } +} + +1; + +=pod +=item command +=item summary try to localize FHEM error messages +=item summary_DE Hilfe bei der Lokalisierung von Fehlermeldungen +=begin html + + +

fhemdebug

+ + +=end html +=cut diff --git a/MAINTAINER.txt b/MAINTAINER.txt index fac581dab..5354f6712 100644 --- a/MAINTAINER.txt +++ b/MAINTAINER.txt @@ -388,6 +388,7 @@ FHEM/98_dewpoint.pm Joachim http://forum.fhem.de Automatis FHEM/98_Dooya.pm Jarnsen/ralf9/darkmission http://forum.fhem.de Sonstige Systeme FHEM/98_dummy.pm rudolfkoenig http://forum.fhem.de Automatisierung FHEM/98_fheminfo.pm mfr69bs http://forum.fhem.de Sonstiges +FHEM/98_fhemdebug.pm rudolfkoenig http://forum.fhem.de Sonstiges FHEM/98_help.pm betateilchen http://forum.fhem.de Sonstiges FHEM/98_HourCounter.pm john http://forum.fhem.de MAX FHEM/98_logProxy.pm justme1968 http://forum.fhem.de Frontends/SVG Plots logProxy diff --git a/fhem.pl b/fhem.pl index 6960c5ec5..5be7c4e91 100755 --- a/fhem.pl +++ b/fhem.pl @@ -1025,6 +1025,7 @@ AnalyzePerlCommand($$;$) $cmdFromAnalyze = $cmd; my $ret = eval $cmd; + Log 1, "ERROR evaluating $cmd: $@" if($@); $ret = $@ if($@); $cmdFromAnalyze = undef; return $ret; @@ -1162,6 +1163,7 @@ devspec2array($;$) if(!$hash->{TYPE}) { Log 1, "Error: >$d< has no TYPE, but following keys: >". join(",", sort keys %{$hash})."<"; + delete($defs{$d}); next; } my $val; @@ -4670,7 +4672,7 @@ fhemFork() foreach my $d (sort keys %defs) { my $h = $defs{$d}; $h->{DBH}->{InactiveDestroy} = 1 - if($h->{TYPE} eq 'DbLog' && $h->{DBH}); #Forum #43271 + if($h->{DBH} && $h->{TYPE} eq 'DbLog'); #Forum #43271 TcpServer_Close($h) if($h->{SERVERSOCKET}); if($h->{DeviceName}) { require "$attr{global}{modpath}/FHEM/DevIo.pm";