diff --git a/fhem/FHEM/98_DOIF.pm b/fhem/FHEM/98_DOIF.pm
index 91e294daf..0f6b945c6 100644
--- a/fhem/FHEM/98_DOIF.pm
+++ b/fhem/FHEM/98_DOIF.pm
@@ -21,6 +21,7 @@
package main;
use strict;
use warnings;
+use Blocking;
use Color;
use vars qw($FW_CSRF);
@@ -38,10 +39,18 @@ sub DOIF_delTimer($)
RemoveInternalTimer (\$hash->{ptimer}{$key});
}
}
+sub DOIF_killBlocking($)
+{
+ my ($hash) = @_;
+ foreach my $key (keys %{$hash->{var}{blockingcalls}}) {
+ BlockingKill($hash->{var}{blockingcalls}{$key}) if(defined($hash->{var}{blockingcalls}{$key}));
+ }
+}
sub DOIF_delAll($)
{
my ($hash) = @_;
+ DOIF_killBlocking($hash);
delete ($hash->{helper});
delete ($hash->{condition});
delete ($hash->{do});
@@ -80,6 +89,7 @@ sub DOIF_Initialize($)
$hash->{SetFn} = "DOIF_Set";
$hash->{GetFn} = "DOIF_Get";
$hash->{UndefFn} = "DOIF_Undef";
+ $hash->{ShutdownFn} = "DOIF_Shutdown";
$hash->{AttrFn} = "DOIF_Attr";
$hash->{NotifyFn} = "DOIF_Notify";
$hash->{FW_deviceOverview} = 1;
@@ -3262,6 +3272,14 @@ DOIF_Undef
my ($hash, $name) = @_;
$hash->{DELETED} = 1;
DOIF_delTimer($hash);
+ DOIF_killBlocking($hash);
+ return undef;
+}
+sub
+DOIF_Shutdown
+{
+ my ($hash) = @_;
+ DOIF_killBlocking($hash);
return undef;
}
@@ -5527,10 +5545,11 @@ Timer setzen: set_Exec(<timerName>, <seconds>, <function
welcher nach Ablauf die angegebene Perl-Funktion <function> mit optionalen Parameter <parameter> aufruft. Die Perlfunkion muss eindeutig sein und in FHEM zuvor deklariert worden sein.
Wird set_Exec mit dem gleichen <timerName> vor seinem Ablauf erneut aufgerufen, so wird der laufender Timer gelöscht und neugesetzt.
-Timer holen: get_Exec(<timerNamet>)
, Returnwert: 0, wenn Timer abgelaufen oder nicht gesetzt ist, sonst Anzahl der Sekunden bis zum Ablauf des Timers
+Timer holen: get_Exec(<timerName>)
, Returnwert: 0, wenn Timer abgelaufen oder nicht gesetzt ist, sonst Anzahl der Sekunden bis zum Ablauf des Timers
Laufenden Timer löschen: del_Exec(<timerName>)
+
Ein beliebiges FHEM-Event absetzen: set_Event(<Event>)
Reading schreiben: set_Reading(<readingName>,<content>,<trigger>)
, mit <trigger>: 0 ohne Trigger, 1 mit Trigger
@@ -5553,6 +5572,18 @@ $_betrag{$i}=100;
Ebenso funktionieren hash-Variablen z. B.:
$_betrag{heute}=100;
+Blokierende Funktionsaufrufe (blocking calls)
+
+DOIF verwaltet blockierende Funktionsaufrufe, d.h. die in diesem Zusammenhang gestarteten FHEM-Instanzen werden gelöscht, beim Herunterfahren (shutdown), Wiedereinlesen der Konfiguration (rereadcfg) Änderung der Konfiguration (modify) und Deaktivieren des Gerätes (disabled).
+Die Handhabung von blockierenden Funktionsaufrufen ist im FHEMwiki erklärt, s. Blocking Call.
+Der von der Funktion BlockingCall zurückgegebene Datensatz ist unterhalb von $_blockingcalls abzulegen, z.B.
+
+$_blockingcalls{<blocking call name>} = BlockingCall(<blocking function>, <argument>, <finish function>, <timeout>, <abort function>, <abort argument>) unless(defined($_blockingcalls{<blocking call name>}));
+
+Für unterschiedliche blockierende Funktionen ist jeweils ein eigener Name (<blocking call name>) unterhalb von $_blockingcalls anzulegen.
+
+$_blockingcalls ist eine für DOIF reservierte Variable und darf nur in der beschriebenen Weise verwendet werden.
+
Nutzbare Attribute im Perl-Modus