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:
parent
5481b9e76b
commit
56faf322bf
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user