Ok. Theoretisch hat ja ein Event im Gegensatz zu einer Fehlermeldung ein recht definiertes Format und man könnte es evtl. mit einem RegExp unterscheiden. Aber das ist jetzt wirklich ein Cornercase.
So ist es schon recht schön.
Ich habe jetzt mal mit meinem Test-Raspi ein paar Fälle durchgespielt.
Ein FHEM shutdown des remote systems wird zügig erkannt (hat jetzt mit dem keepalive denke ich nichts zu tun). Auch ein kill -9 wird sofort erkannt.
Wenn ich jedoch den Stecker am Rapsi ziehe, dann meldet das keepalive weiter 8 erfolgreiche übertragene Zeichen - auch noch nach ein paar Minuten. (han 10s intervall eingestellt)
FHEM2FHEM erkennt nicht, dass der gegenüber schon längst weg ist.
Ich hab jetzt mal nur zum Test einen "ping" implementiert:
sub
FHEM2FHEM_keepalive($)
{
my ($hash) = @_;
my $name=$hash->{NAME};
my $ki = AttrVal($hash->{NAME}, "keepaliveInterval", 0);
return if(!$ki || !$hash->{TCPDev});
my $ret=syswrite($hash->{TCPDev}, "{undef}\n");
Log3 $name, 3 , "Keepalive $ret";
my $host=$hash->{Host};
my @hostname=split(":",$host);
$host=$hostname[0];
Log3 $name, 3, "Ping on $host";
my $p = Net::Ping->new();
eval { $ret=$p->ping($host,0.5) };
if (!$ret) {
Log3 $name, 3 , "Ping error";
FHEM2FHEM_Disconnected($hash);
} else {
Log3 $name, 3, "Ping successful";
}
$p->close();
InternalTimer(gettimeofday()+$ki, "FHEM2FHEM_keepalive", $hash);
}
Das klappt dann eigentlich recht gut. Er merkt gleich beim ersten KeepAlive, dass der Rechner weg ist, geht in Disconnected State und merkt dann auch wenn der Rechner wieder hochkommt.
Vielleicht kann man das aber auch noch eleganter lösen (und sicher schöner implementieren)
Jörg