diff --git a/fhem/FHEM/00_OWX_ASYNC.pm b/fhem/FHEM/00_OWX_ASYNC.pm index 4e87a2b39..02362aadd 100644 --- a/fhem/FHEM/00_OWX_ASYNC.pm +++ b/fhem/FHEM/00_OWX_ASYNC.pm @@ -127,7 +127,7 @@ my %attrs = ( ); #-- some globals needed for the 1-Wire module -$owx_async_version=5.9; +$owx_async_version=5.10; #-- Debugging 0,1,2,3 $owx_async_debug=0; @@ -158,7 +158,7 @@ sub OWX_ASYNC_Initialize ($) { $hash->{ReadFn} = "OWX_ASYNC_Read"; $hash->{ReadyFn} = "OWX_ASYNC_Ready"; $hash->{InitFn} = "OWX_ASYNC_Init"; - $hash->{AttrList} = "dokick:0,1 interval IODev timeout"; + $hash->{AttrList} = "dokick:0,1 interval IODev timeout maxtimeouts"; main::LoadModule("OWX"); } @@ -1060,6 +1060,11 @@ sub OWX_ASYNC_RunTasks($) { $task->PT_CANCEL("Timeout"); shift @{$current->{queue}}; $main::defs{$current->{device}}->{NUMTASKS} = @{$current->{queue}}; + $master->{TIMEOUTS}++; + if ($master->{TIMEOUTS} > AttrVal($master->{NAME},"maxtimeouts",5)) { + Log3 ($master->{NAME},3,"OWX_ASYNC_RunTasks: $master->{NAME} maximum number of timeouts exceedet ($master->{TIMEOUTS}), trying to reconnect"); + OWX_ASYNC_Disconnect($master); + } next; } else { Log3 $master->{NAME},5,"OWX_ASYNC_RunTasks: $current->{device} task waiting for data or timeout" if ($owx_async_debug>2); @@ -1084,6 +1089,7 @@ sub OWX_ASYNC_RunTasks($) { my $state = $task->PT_STATE(); if ($state == PT_ENDED) { Log3 ($master->{NAME},5,"OWX_ASYNC_RunTasks: $current->{device} task finished"); + $master->{TIMEOUTS} = 0; } elsif ($state == PT_EXITED) { Log3 ($master->{NAME},4,"OWX_ASYNC_RunTasks: $current->{device} task exited: ".(defined $task->PT_RETVAL() ? $task->PT_RETVAL : "- no retval -")); } elsif ($state == PT_ERROR) { @@ -1214,9 +1220,12 @@ sub OWX_ASYNC_RunTasks($) {
attr <name> dokick 0|1
attr <name> IODev
+ attr <name> IODev <FRM-device>
attr <name> maxtimeouts <number>
+