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