diff --git a/fhem/FHEM/00_ZWCUL.pm b/fhem/FHEM/00_ZWCUL.pm index 25d4631c7..5ef35f192 100755 --- a/fhem/FHEM/00_ZWCUL.pm +++ b/fhem/FHEM/00_ZWCUL.pm @@ -24,7 +24,7 @@ sub ZWCUL_SimpleWrite($$); sub ZWCUL_Write($$$); sub ZWCUL_ProcessSendStack($); -use vars qw(%zwave_id2class); +our %zwave_id2class; my %ZWCUL_sentIdx; my %ZWCUL_sentIdx2cbid; diff --git a/fhem/FHEM/01_FHEMWEB.pm b/fhem/FHEM/01_FHEMWEB.pm index 3abaab178..71b8dcbf5 100755 --- a/fhem/FHEM/01_FHEMWEB.pm +++ b/fhem/FHEM/01_FHEMWEB.pm @@ -1047,7 +1047,7 @@ FW_makeTable($$$@) return if(!$hash || !int(keys %{$hash})); my $class = lc($title); $class =~ s/[^A-Za-z]/_/g; - FW_pO "
| ";
- if($modules{$t}{FW_detailFn}) {
- no strict "refs";
- my $txt = &{$modules{$t}{FW_detailFn}}($FW_wname, $d, $FW_room);
- FW_pO "$txt " if(defined($txt)); - use strict "refs"; - } else { + if(!$modules{$t}{FW_detailFn} || $modules{$t}{FW_showStatus}) { my $show = AttrVal($FW_wname, "deviceOverview", "always"); if( $show ne 'never' ) { @@ -1225,6 +1220,13 @@ FW_doDetail($) } } } + if($modules{$t}{FW_detailFn}) { + no strict "refs"; + my $txt = &{$modules{$t}{FW_detailFn}}($FW_wname, $d, $FW_room); + FW_pO "$txt " if(defined($txt)); + use strict "refs"; + } + FW_pO FW_detailSelect($d, "set", FW_widgetOverride($d, getAllSets($d))); FW_pO FW_detailSelect($d, "get", FW_widgetOverride($d, getAllGets($d))); diff --git a/fhem/FHEM/10_ZWave.pm b/fhem/FHEM/10_ZWave.pm index 7ddf04f83..47aaf06f3 100755 --- a/fhem/FHEM/10_ZWave.pm +++ b/fhem/FHEM/10_ZWave.pm @@ -22,8 +22,8 @@ sub ZWave_secEnd($); sub ZWave_configParseModel($;$); sub ZWave_callbackId($); -use vars qw($FW_ME $FW_tp $FW_ss); -use vars qw(%zwave_id2class); +our ($FW_ME,$FW_tp,$FW_ss); +our %zwave_id2class; my %zwave_class = ( NO_OPERATION => { id => '00' }, # lowlevel @@ -504,7 +504,7 @@ my %zwave_modelIdAlias = ( "010f-0301-1001" => "Fibaro_FGRM222", "0115-0100-0102" => "ZME_KFOB" ); # Patching certain devices. -use vars qw(%zwave_deviceSpecial); +our %zwave_deviceSpecial; %zwave_deviceSpecial = ( Fibaro_FGRM222 => { MANUFACTURER_PROPRIETARY => { @@ -578,6 +578,7 @@ ZWave_Initialize($) map { $zwave_id2class{lc($zwave_class{$_}{id})} = $_ } keys %zwave_class; $hash->{FW_detailFn} = "ZWave_fhemwebFn"; + $hash->{FW_showStatus} = 1; eval { require Crypt::Rijndael; }; if($@) { @@ -900,18 +901,14 @@ ZWave_Cmd($$@) my $val; if($type eq "get" && $hash->{CL}) { # Wait for the result for frontend cmd - no strict "refs"; - my $iohash = $hash->{IODev}; - my $fn = $modules{$iohash->{TYPE}}{ReadAnswerFn}; - my $re = $cmdList{$cmd}{regexp}; - my ($err, $data) = &{$fn}($iohash, $cmd, $re ? $re : "^000400${id}..$cmdId") - if($fn); - use strict "refs"; - - return $err if($err); - $data = "$cmd $id $data" if($re); - - $val = ($data ? ZWave_Parse($iohash, $data, $type) : "no data returned"); + if(!$hash->{asyncGet}) { + my $tHash = { hash=>$hash, CL=>$hash->{CL}, re=>"^000400${id}..$cmdId"}; + $hash->{asyncGet} = $tHash; + InternalTimer(gettimeofday()+2, sub { + asyncOutput($tHash->{CL}, "Timeout reading answer for $cmd"); + delete($hash->{asyncGet}); + }, $tHash, 0); + } } elsif($type ne "get") { if($cmd eq "neighborUpdate" || @@ -4113,6 +4110,11 @@ ZWave_Parse($$@) if(AttrVal($name, "eventForRaw", undef)); readingsEndUpdate($hash, 1); + if($hash->{asyncGet} && $msg =~ m/$hash->{asyncGet}->{re}/) { + RemoveInternalTimer($hash->{asyncGet}); + asyncOutput($hash->{asyncGet}{CL}, join("\n", @event)); + delete($hash->{asyncGet}); + } return join("\n", @event) if($srcCmd); return $name; } @@ -4225,7 +4227,7 @@ ZWave_fhemwebFn($$$$) ' |