Hauptmenü

Debug DOIF via Device Dump

Begonnen von _Markus_, 09 März 2018, 16:25:02

Vorheriges Thema - Nächstes Thema

_Markus_

Hallo zusammen,

es gibt schon viele Hilfen um DOIFs zu debuggen.
Was mir bis zuletzt fehlte (oder ich nicht gefunden habe) war die Möglichkeit die Bedingungen und Commands eines DOIFs zum aktuellen Zeitpunkt auszuwerten um zu schauen, wie sich komplizierte Verkettungen von Operanden und Funktionsaufrufen auflösen. Ich habe mir dazu eine Funktion geschrieben - vlt hilft sie jemandem:

sub dumpDevice($) {
my ($dev) = @_;
my @devices = devspec2array($dev);
my $ret = "";
foreach my $device (@devices) {
my $hash = $defs{$device};
#$ret .= "\n\n\nTIME:\n".Dumper($defs{$device}->{time});
$ret .= "\n\nTime:\n";
foreach my $key1 (sort(keys %{$defs{$device}->{time}})) {
my $t = %{$defs{$device}->{time}}{$key1};
my ($def,$err)=ReplaceAllReadingsDoIf($hash,$t,-4,1,"");
$ret .= "\n(".$key1.") ".$t.": ".$def; # ." (err: ".$err.")";
}

#$ret .= "\n\n\n\Commands:\n".Dumper($defs{$device}->{do});
$ret .= "\n\nCommands:\n";
foreach my $key1 (sort(keys %{$defs{$device}->{do}})) {
my $val1 = %{$defs{$device}->{do}}{$key1};
foreach my $key2 (sort(keys %{$val1})) {
my $val2 = %{$val1}{$key2};
my ($def,$err)=ReplaceAllReadingsDoIf($hash,$val2,-4,1,"");
$ret .= "\n(".$key1.",".$key2.") ".$val2.": ".$def; # ." (err: ".$err.")";
}
}

$ret .= "\n\nConditions:\n";
foreach my $key1 (sort(keys %{$defs{$device}->{condition}})) {
my $t = %{$defs{$device}->{condition}}{$key1};
$t =~ s/\s\s/\n/g;
my ($def,$err)=ReplaceAllReadingsDoIf($hash,$t,-4,1,"");
$def =~ s/(ReadingValDoIf\([^)]*\))/"\"".eval($1)."\""/ge;
$def =~ s/(ReadingsVal\([^)]*\))/"\"".eval($1)."\""/ge;
$def =~ s/(ReadingSecDoIf\([^)]*\))/"\"".eval($1)."\""/ge;
$ret .= "\n\n(".$key1.") ".$t;
$ret .= "\n\n //==> First Eval (ReadingValDoIf):\n".$def; # ." (err: ".$err.")";
$def =~ s/(Value\([^)]*\))/"\"".eval($1)."\""/ge;
$ret .= "\n\n //==> Second Eval (Value):\n".$def."\n\n"; # ." (err: ".$err.")";
}

$ret .= "\n\n\nDEF:\n".Dumper($defs{$device}{DEF});
$ret .= "\n\n\nComplete DUMP:\n".Dumper($defs{$device});
}
return $ret;
}


Viele Grüße
Markus

Ellert

#1
Ich hab mal ein Dump erstellt. Mir sind dabei keine offensichtlichen inhaltlichen Unterschiede zum list-Befehl aufgefallen.

Könntest Du mal einen Tipp geben wo die Unterschiede liegen?

Edit
Dass kein offensichtlicher Unterschied zu sehen war lag an dem DOIF, da hat der "komplette Dump" von den Auflösungen abgelenkt.

Ich habe mal ein komplexeres DOIF untersucht, da wirds deutlicher.

Den Beitrag habe ich im Wiki verlinkt https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche#Bedingungen_und_Befehle_zum_aktuellen_Zeitpunkt_auszuwerten_.28Dump_von_DOIF.29