2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-19 12:46:03 +00:00

vbs did some changes

git-svn-id: https://svn.fhem.de/fhem/trunk@6079 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
bentele 2014-06-07 08:54:16 +00:00
parent 5481b9e76b
commit 56faf322bf

View File

@ -29,9 +29,12 @@
############################################################################## ##############################################################################
package main; package main;
use strict;
use warnings;
use IO::Socket::INET; use IO::Socket::INET;
use Sys::Hostname; use Sys::Hostname;
use MIME::Base64; use MIME::Base64;
use DevIo;
my @gets = ('dummy'); my @gets = ('dummy');
@ -40,10 +43,20 @@ STV_Initialize($)
{ {
my ($hash) = @_; my ($hash) = @_;
$hash->{DefFn} = "STV_Define"; $hash->{DefFn} = "STV_Define";
$hash->{UndefFn} = "STV_Undefine";
$hash->{StateFn} = "STV_SetState"; $hash->{StateFn} = "STV_SetState";
$hash->{SetFn} = "STV_Set"; $hash->{SetFn} = "STV_Set";
$hash->{AttrFn} = "STV_Attr"; $hash->{AttrFn} = "STV_Attr";
$hash->{AttrList} = "MAC"; $hash->{ReadFn} = "STV_Read";
$hash->{ReadyFn} = "STV_Ready";
$hash->{AttrList} = "MAC fork:enable,disable setWhenOffline:execute,ignore " . $readingFnAttributes;;
}
sub STV_Undefine($$)
{
my ($hash,$arg) = @_;
DevIo_CloseDev($hash);
return undef;
} }
sub sub
@ -61,7 +74,7 @@ STV_SetState($$$$)
{ {
my ($hash, $tim, $vt, $val) = @_; my ($hash, $tim, $vt, $val) = @_;
$val = $1 if($val =~ m/^(.*) \d+$/); $val = $1 if($val =~ m/^(.*) \d+$/);
return "Undefined value $val" if(!defined($it_c2b{$val})); # return "Undefined value $val" if(!defined($it_c2b{$val}));
return undef; return undef;
} }
@ -72,9 +85,65 @@ sub getIP()
return "$address"; return "$address";
} }
sub STV_Ready($)
{
my ($hash) = @_;
if(AttrVal($hash->{NAME},'fork','disable') eq 'enable') {
if($hash->{CHILDPID} && !(kill 0, $hash->{CHILDPID})) {
$hash->{CHILDPID} = undef;
return DevIo_OpenDev($hash, 1, "STV_Init");
}
elsif(!$hash->{CHILDPID}) {
return if($hash->{CHILDPID} = fork);
my $ppid = getppid();
### Copied from Blocking.pm
foreach my $d (sort keys %defs) { # Close all kind of FD
my $h = $defs{$d};
TcpServer_Close($h) if($h->{SERVERSOCKET});
if($h->{DeviceName}) {
require "$attr{global}{modpath}/FHEM/DevIo.pm";
DevIo_CloseDev($h,1);
}
}
### End of copied from Blocking.pm
while(kill 0, $ppid) {
DevIo_OpenDev($hash, 1, "STV_ChildExit");
sleep(5);
}
exit(0);
}
} else {
return DevIo_OpenDev($hash, 1, "STV_Init");
}
return undef;
}
sub STV_Read($)
{
my ($hash) = @_;
my $name = $hash->{NAME};
#we dont really expect data here. Its just to gracefully close the device if the connection was closed
my $buf = DevIo_SimpleRead($hash);
}
sub STV_Init($)
{
my ($hash) = @_;
return undef;
}
sub STV_ChildExit($)
{
exit(0);
}
sub STV_Define($$) sub STV_Define($$)
{ {
my ($hash, $def) = @_; my ($hash, $def) = @_;
DevIo_CloseDev($hash);
my @args = split("[ \t]+", $def); my @args = split("[ \t]+", $def);
if (int(@args) < 3) if (int(@args) < 3)
@ -100,6 +169,7 @@ sub STV_Define($$)
"PLAY PAUSE REWIND FF REC STOP ". "PLAY PAUSE REWIND FF REC STOP ".
"TV HDMI PIP_ONOFF ASPECT EXT20"; "TV HDMI PIP_ONOFF ASPECT EXT20";
my $system = $^O; my $system = $^O;
my $result;
if($system =~ m/Win/) { if($system =~ m/Win/) {
$result = `ipconfig /all`; $result = `ipconfig /all`;
my @myarp=split(/\n/,$result); my @myarp=split(/\n/,$result);
@ -127,6 +197,10 @@ sub STV_Define($$)
$hash->{MAC} = $result; $hash->{MAC} = $result;
$hash->{MyIP} = getIP(); $hash->{MyIP} = getIP();
$hash->{DeviceName} = $hash->{Host} . ":" . $hash->{Port};
my $dev = $hash->{DeviceName};
$readyfnlist{"$args[0].$dev"} = $hash;
} }
if ( $hash->{Port} != 55000 && $hash->{Port} != 52235 ){ if ( $hash->{Port} != 55000 && $hash->{Port} != 52235 ){
@ -144,7 +218,7 @@ sub connection($$)
Log3 undef, 4, "[STV] connection message: $tmp"; Log3 undef, 4, "[STV] connection message: $tmp";
my $TV = shift; my $TV = shift;
my $buffer = ""; my $buffer = "";
my $tmp2 = ""; my @tmp2 = "";
my $sock = new IO::Socket::INET ( my $sock = new IO::Socket::INET (
PeerAddr => $TV, PeerAddr => $TV,
@ -174,7 +248,6 @@ sub STV_55000($$$)
my $par=undef; my $par=undef;
my @ARGV = split(" ",$cmd); my @ARGV = split(" ",$cmd);
#### Configuration #### Configuration
my $name = $hash->{NAME};
my $tv = "UE46ES8090"; # Might need changing to match your TV type #"UE46ES8090" my $tv = "UE46ES8090"; # Might need changing to match your TV type #"UE46ES8090"
my $port = $hash->{Port}; # TCP port of Samsung TV my $port = $hash->{Port}; # TCP port of Samsung TV
my $tvip = $hash->{Host}; # IP Address of TV #"192.168.2.124" my $tvip = $hash->{Host}; # IP Address of TV #"192.168.2.124"
@ -199,6 +272,7 @@ sub STV_55000($$$)
Proto => 'tcp', Proto => 'tcp',
Timout => 5 Timout => 5
); );
if (defined ($sock)){ if (defined ($sock)){
my $messagepart1 = chr(0x64) . chr(0x00) . chr(length(encode_base64($myip, ""))) . chr(0x00) . encode_base64($myip, "") . chr(length(encode_base64($mymac, ""))) . chr(0x00) . encode_base64($mymac, "") . chr(length(encode_base64($remotename, ""))) . chr(0x00) . encode_base64($remotename, ""); my $messagepart1 = chr(0x64) . chr(0x00) . chr(length(encode_base64($myip, ""))) . chr(0x00) . encode_base64($myip, "") . chr(length(encode_base64($mymac, ""))) . chr(0x00) . encode_base64($mymac, "") . chr(length(encode_base64($remotename, ""))) . chr(0x00) . encode_base64($remotename, "");
my $part1 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart1)) . chr(0x00) . $messagepart1; my $part1 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart1)) . chr(0x00) . $messagepart1;
@ -237,9 +311,8 @@ sub STV_55000($$$)
} }
# old Samsung Models # old Samsung Models
sub STV_52235($@$@) sub STV_52235($@)
{ {
my ($hash, @a) = @_; my ($hash, @a) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $TV = $hash->{Host}; my $TV = $hash->{Host};
@ -488,6 +561,11 @@ sub STV_Set($@)
return $hash->{".validcommands"}; return $hash->{".validcommands"};
} }
if ($hash->{".validcommands"} =~ /$cmd/) { if ($hash->{".validcommands"} =~ /$cmd/) {
if ((AttrVal($name, "setWhenOffline", undef) eq "ignore") and ($hash->{STATE} ne "opened")) {
Log3 $name, 3, "[STV] Device seems offline. Set command ignored: $cmd";
return;
}
if ($Port eq 55000 ){ if ($Port eq 55000 ){
STV_55000($hash,$nam,$cmd); STV_55000($hash,$nam,$cmd);
} }