diff --git a/FHEM/89_VCONTROL.pm b/FHEM/89_VCONTROL.pm index 63a67d097..41815d9b5 100644 --- a/FHEM/89_VCONTROL.pm +++ b/FHEM/89_VCONTROL.pm @@ -72,6 +72,9 @@ my %DayHash; my @mode = ("WW","RED","NORM","H+WW","H+WW FS","ABSCHALT"); my $temp_mode=0; +#define LAN Hardware (1) or USB device (0) +my $LAN_HW = 0; + ###################################################################################### sub VCONTROL_1ByteUParse($$); sub VCONTROL_1ByteSParse($$); @@ -116,7 +119,7 @@ VCONTROL_Initialize($) } ##################################### -# define VIESSMANN [] +# define VIESSMANN [] sub VCONTROL_Define($$) @@ -137,6 +140,10 @@ VCONTROL_Define($$) delete $hash->{USBDev}; delete $hash->{FD}; } + else { + ###LAN Hardware found + $LAN_HW = 1; + } DevIo_CloseDev($hash); my $name = $a[0]; @@ -175,6 +182,7 @@ VCONTROL_Define($$) #Opening USB Device Log3($name, 3, "VCONTROL opening VCONTROL device $dev"); + my $ret = undef; ###USB if (index($a[2], ':') == -1) { @@ -208,17 +216,16 @@ VCONTROL_Define($$) } else { - DevIo_OpenDev($hash, 0, undef); - VCONTROL_DoInit($hash, undef); + $ret = DevIo_OpenDev($hash, 0, "VCONTROL_DoInit"); } - + #set Internal Timer on Polling Interval my $timer = gettimeofday()+1; Log3($name, 5, "VCONTROL set InternalTimer +1 to $timer"); InternalTimer(gettimeofday()+1, "VCONTROL_Poll", $hash, 0); - return undef; + return $ret; } @@ -316,7 +323,7 @@ VCONTROL_Clear($) sub VCONTROL_DoInit($$) { - #Initialisation -> Send one 0x04 so the heating started to send 0x05 Synchonity-Bytes + #Initialisation -> Send one 0x04 so the heating started to send 0x05 Synchronity-Bytes my ($hash,$po) = @_; my $name = $hash->{NAME}; my $init = pack('H*', "04"); @@ -347,7 +354,6 @@ VCONTROL_DoInit($$) sub VCONTROL_Read($) { - my ($hash) = @_; my $name = $hash->{NAME}; Log3 $name, 5,"VCONTROL_READ"; @@ -357,13 +363,14 @@ VCONTROL_Read($) #Read on Device my $mybuf = DevIo_SimpleRead($hash); + if ($LAN_HW == 0) { #USB device is disconnected try to connect again if(!defined($mybuf) || length($mybuf) == 0) { my $dev = $hash->{DeviceName}; Log3 $name, 3,"VCONTROL: USB device $dev disconnected, waiting to reappear"; $hash->{USBDev}->close(); DoTrigger($name, "DISCONNECTED"); - + DevIo_Disconnected($hash); delete($hash->{USBDev}); delete($selectlist{"$name.$dev"}); $readyfnlist{"$name.$dev"} = $hash; # Start polling @@ -374,6 +381,16 @@ VCONTROL_Read($) sleep(5); return ""; } + } + else { + if(!defined($mybuf) || length($mybuf) == 0) { + my $dev = $hash->{DeviceName}; + Log3 $name, 3,"VCONTROL: LAN device $dev disconnected, waiting to reappear"; + DevIo_Disconnected($hash); + $hash->{STATE} = "disconnected"; + return ""; + } + } #msg read on device my $hexline = unpack('H*', $mybuf); @@ -697,12 +714,15 @@ VCONTROL_Ready($) } } else { $hash->{PARTIAL} = ""; - DevIo_OpenDev($hash, 1, undef); - return undef if(!exists($hash->{FD})); - return undef if(!defined($_[0]->{TCPDev})); - VCONTROL_DoInit($hash, undef); - DoTrigger($name, "CONNECTED"); - return undef; + return DevIo_OpenDev($hash, 1, "VCONTROL_DoInit") + if($hash->{STATE} eq "disconnected"); + # This is relevant for windows/USB only + my $po = $hash->{USBDev}; + my ($BlockingFlags, $InBytes, $OutBytes, $ErrorFlags); + if($po) { + ($BlockingFlags, $InBytes, $OutBytes, $ErrorFlags) = $po->status; + } + return ($InBytes && $InBytes>0); } @@ -1174,14 +1194,14 @@ sub VCONTROL_TimerConv($$){

VCONTROL