fix input device list

This commit is contained in:
Marko Oldenburg 2022-01-04 21:44:00 +01:00
parent 47b20c4d3e
commit 79774e3352

View File

@ -51,18 +51,20 @@
package main; package main;
my $missingModul = "";
use strict; use strict;
use warnings; use warnings;
use experimental qw( switch );
use FHEM::Meta; use FHEM::Meta;
eval { use MIME::Base64; 1 } or $missingModul .= "MIME::Base64 "; my $missingModul = "";
eval { use IO::Socket::INET; 1 } or $missingModul .= "IO::Socket::INET ";
eval { use Digest::SHA qw(sha1_hex); 1 } or $missingModul .= "Digest::SHA "; eval { require MIME::Base64; 1 } or $missingModul .= "MIME::Base64 ";
eval { use Encode qw(encode_utf8 decode_utf8); 1 } eval { require IO::Socket::INET; 1 } or $missingModul .= "IO::Socket::INET ";
eval { use Digest::SHA qw /sha1_hex/; 1 } or $missingModul .= "Digest::SHA ";
eval { use Encode qw /encode_utf8 decode_utf8/; 1 }
or $missingModul .= "Encode "; or $missingModul .= "Encode ";
eval { use Blocking; 1 } or $missingModul .= "Blocking "; eval { require Blocking; 1 } or $missingModul .= "Blocking ";
# try to use JSON::MaybeXS wrapper # try to use JSON::MaybeXS wrapper
# for chance of better performance + open code # for chance of better performance + open code
@ -221,11 +223,14 @@ sub LGTV_WebOS_Initialize {
sub LGTV_WebOS_Define { sub LGTV_WebOS_Define {
my ( $hash, $def ) = @_; my ( $hash, $def ) = @_;
my $version;
my @a = split( "[ \t][ \t]*", $def );
return $@ unless ( FHEM::Meta::SetInternals($hash) ); return $@ unless ( FHEM::Meta::SetInternals($hash) );
use version 0.60; our $VERSION = FHEM::Meta::Get( $hash, 'version' );
$version = FHEM::Meta::Get( $hash, 'version' );
our $VERSION = $version;
my @a = split( "[ \t][ \t]*", $def );
return "too few parameters: define <name> LGTV_WebOS <HOST>" if ( @a != 3 ); return "too few parameters: define <name> LGTV_WebOS <HOST>" if ( @a != 3 );
return return
@ -404,8 +409,6 @@ sub LGTV_WebOS_Set {
my $uri; my $uri;
my %payload; my %payload;
my $inputs;
my @inputs;
if ( $cmd eq 'connect' ) { if ( $cmd eq 'connect' ) {
return "usage: connect" if ( @args != 0 ); return "usage: connect" if ( @args != 0 );
@ -457,10 +460,14 @@ sub LGTV_WebOS_Set {
} }
elsif ( AttrVal( $name, 'wakeupCmd', 'none' ) ne 'none' ) { elsif ( AttrVal( $name, 'wakeupCmd', 'none' ) ne 'none' ) {
my $wakeupCmd = AttrVal( $name, 'wakeupCmd', 'none' ); my $wakeupCmd = AttrVal( $name, 'wakeupCmd', 'none' );
if ( $wakeupCmd =~ s/^[ \t]*\{|\}[ \t]*$//g ) { if ( $wakeupCmd =~ s/^[ \t]*\{|\}[ \t]*$//xg ) {
Log3 $name, 4, Log3 $name, 4,
"LGTV_WebOS executing wake-up command (Perl): $wakeupCmd"; "LGTV_WebOS executing wake-up command (Perl): $wakeupCmd";
eval $wakeupCmd; eval { $wakeupCmd } or do {
Log3 $name, 2,
"LGTV_WebOS executing wake-up command (Perl): $wakeupCmd failed";
return;
};
return; return;
} }
else { else {
@ -639,7 +646,7 @@ sub LGTV_WebOS_Open {
Log3 $name, 4, "LGTV_WebOS ($name) - Baue Socket Verbindung auf"; Log3 $name, 4, "LGTV_WebOS ($name) - Baue Socket Verbindung auf";
my $socket = new IO::Socket::INET( my $socket = IO::Socket::INET->new(
PeerHost => $host, PeerHost => $host,
PeerPort => $port, PeerPort => $port,
Proto => 'tcp', Proto => 'tcp',
@ -738,9 +745,9 @@ sub LGTV_WebOS_Read {
return; return;
} }
if ( $buf =~ /(\{"type":".+}}$)/ ) { if ( $buf =~ /(\{"type":".+}}$)/x ) {
$buf =~ /(\{"type":".+}}$)/; $buf =~ /(\{"type":".+}}$)/x;
$buf = $1; $buf = $1;
Log3 $name, 4, Log3 $name, 4,
@ -748,7 +755,7 @@ sub LGTV_WebOS_Read {
LGTV_WebOS_ResponseProcessing( $hash, $buf ); LGTV_WebOS_ResponseProcessing( $hash, $buf );
} }
elsif ( $buf =~ /HTTP\/1.1 101 Switching Protocols/ ) { elsif ( $buf =~ /HTTP\/1.1 101 Switching Protocols/x ) {
Log3 $name, 4, Log3 $name, 4,
"LGTV_WebOS ($name) - received HTTP data string, start response processing: $buf"; "LGTV_WebOS ($name) - received HTTP data string, start response processing: $buf";
@ -811,7 +818,7 @@ sub LGTV_WebOS_ProcessRead {
. $tail; . $tail;
LGTV_WebOS_ResponseProcessing( $hash, $json ) LGTV_WebOS_ResponseProcessing( $hash, $json )
unless ( !defined($tail) && not($tail) ); if ( defined($tail) && ($tail) );
( $json, $tail ) = LGTV_WebOS_ParseMsg( $hash, $tail ); ( $json, $tail ) = LGTV_WebOS_ParseMsg( $hash, $tail );
@ -871,7 +878,7 @@ sub LGTV_WebOS_ResponseProcessing {
######################## ########################
### Response has HTML Header ### Response has HTML Header
if ( $response =~ /HTTP\/1.1 101 Switching Protocols/ ) { if ( $response =~ /HTTP\/1.1 101 Switching Protocols/x ) {
my $data = $response; my $data = $response;
my $header = LGTV_WebOS_Header2Hash($data); my $header = LGTV_WebOS_Header2Hash($data);
@ -913,10 +920,10 @@ sub LGTV_WebOS_ResponseProcessing {
return; return;
} }
elsif ( $response =~ m/^{"type":".+}}$/ ) { elsif ( $response =~ m/^{"type":".+}}$/x ) {
return Log3 $name, 4, "LGTV_WebOS ($name) - garbage after JSON object" return Log3 $name, 4, "LGTV_WebOS ($name) - garbage after JSON object"
if ( $response =~ m/^{"type":".+}}.+{"type":".+/ ); if ( $response =~ m/^{"type":".+}}.+{"type":".+/x );
Log3 $name, 4, Log3 $name, 4,
"LGTV_WebOS ($name) - JSON detected, run LGTV_WebOS_WriteReadings"; "LGTV_WebOS ($name) - JSON detected, run LGTV_WebOS_WriteReadings";
@ -926,7 +933,7 @@ sub LGTV_WebOS_ResponseProcessing {
Log3 $name, 4, "LGTV_WebOS ($name) - Corrected JSON String: $json" Log3 $name, 4, "LGTV_WebOS ($name) - Corrected JSON String: $json"
if ($json); if ($json);
if ( !defined($json) || not($json) ) { if ( !defined($json) || !($json) ) {
Log3 $name, 4, "LGTV_WebOS ($name) - Corrected JSON String empty"; Log3 $name, 4, "LGTV_WebOS ($name) - Corrected JSON String empty";
return; return;
@ -952,9 +959,7 @@ sub LGTV_WebOS_WriteReadings {
my ( $hash, $decode_json ) = @_; my ( $hash, $decode_json ) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $mute;
my $response; my $response;
my %channelList;
Log3 $name, 4, "LGTV_WebOS ($name) - Beginn Readings writing"; Log3 $name, 4, "LGTV_WebOS ($name) - Beginn Readings writing";
@ -980,23 +985,24 @@ sub LGTV_WebOS_WriteReadings {
for my $devices ( @{ $decode_json->{payload}{devices} } ) { for my $devices ( @{ $decode_json->{payload}{devices} } ) {
if ( if (
not !defined(
defined( $hash->{helper}{device}{inputs}{ $devices->{label} } ) $hash->{helper}{device}{inputs}{ $devices->{label} }
)
|| !defined( || !defined(
$hash->{helper}{device}{inputapps}{ $devices->{appId} } $hash->{helper}{device}{inputapps}{ $devices->{appId} }
) )
) )
{ {
$hash->{helper}{device}{inputs}{ $devices->{label} } = $hash->{helper}{device}{inputs}
$devices->{appId}; { makeDeviceName( $devices->{label} ) } = $devices->{appId};
$hash->{helper}{device}{inputapps}{ $devices->{appId} } = $hash->{helper}{device}{inputapps}{ $devices->{appId} } =
$devices->{label}; makeDeviceName( $devices->{label} );
} }
readingsBulkUpdateIfChanged( readingsBulkUpdateIfChanged(
$hash, $hash,
'extInput_' . $devices->{label}, 'extInput_' . makeDeviceName( $devices->{label} ),
'connect_' . $devices->{connected} 'connect_' . $devices->{connected}
); );
} }
@ -1005,7 +1011,7 @@ sub LGTV_WebOS_WriteReadings {
elsif ( ref( $decode_json->{payload}{programList} ) eq "ARRAY" elsif ( ref( $decode_json->{payload}{programList} ) eq "ARRAY"
&& scalar( @{ $decode_json->{payload}{programList} } ) > 0 ) && scalar( @{ $decode_json->{payload}{programList} } ) > 0 )
{ {
use Date::Parse; require Date::Parse;
my $count = 0; my $count = 0;
for my $programList ( @{ $decode_json->{payload}{programList} } ) { for my $programList ( @{ $decode_json->{payload}{programList} } ) {
@ -1130,8 +1136,8 @@ sub LGTV_WebOS_WriteReadings {
if ( if (
( (
$decode_json->{payload}{appId} =~ /com.webos.app.externalinput/ $decode_json->{payload}{appId} =~ /com.webos.app.externalinput/x
|| $decode_json->{payload}{appId} =~ /com.webos.app.hdmi/ || $decode_json->{payload}{appId} =~ /com.webos.app.hdmi/x
) )
&& defined( && defined(
$hash->{helper}{device}{inputapps} $hash->{helper}{device}{inputapps}
@ -1252,8 +1258,6 @@ sub LGTV_WebOS_Pairing {
my $hash = shift; my $hash = shift;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $lgKey;
Log3 $name, 4, "LGTV_WebOS ($name) - HASH handshakePayload"; Log3 $name, 4, "LGTV_WebOS ($name) - HASH handshakePayload";
my %handshakePayload = ( my %handshakePayload = (
@ -1334,7 +1338,6 @@ sub LGTV_WebOS_CreateSendCommand {
my ( $hash, $uri, $payload, $type ) = @_; my ( $hash, $uri, $payload, $type ) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $err;
$type = 'request' if ( !defined($type) ); $type = 'request' if ( !defined($type) );
@ -1366,28 +1369,27 @@ sub LGTV_WebOS_Hybi10Encode {
my $frame = ""; my $frame = "";
my $payloadLength = length($payload); my $payloadLength = length($payload);
if ( $type eq "text" ) { given ($type) {
when ('text') {
# first byte indicates FIN, Text-Frame (10000001): # first byte indicates FIN, Text-Frame (10000001):
$frameHead[0] = 129; $frameHead[0] = 129;
}
when ('close') {
} # first byte indicates FIN, Close Frame(10001000):
elsif ( $type eq "close" ) { $frameHead[0] = 136;
}
when ('ping') {
# first byte indicates FIN, Close Frame(10001000): # first byte indicates FIN, Ping frame (10001001):
$frameHead[0] = 136; $frameHead[0] = 137;
}
when ('pong') {
} # first byte indicates FIN, Pong frame (10001010):
elsif ( $type eq "ping" ) { $frameHead[0] = 138;
}
# first byte indicates FIN, Ping frame (10001001):
$frameHead[0] = 137;
}
elsif ( $type eq "pong" ) {
# first byte indicates FIN, Pong frame (10001010):
$frameHead[0] = 138;
} }
# set mask and payload length (using 1, 3 or 9 bytes) # set mask and payload length (using 1, 3 or 9 bytes)
@ -1542,21 +1544,21 @@ sub LGTV_WebOS_ParseMsg {
my $hash = shift; my $hash = shift;
my $buffer = shift; my $buffer = shift;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $open = 0; my $jsonopen = 0;
my $close = 0; my $jsonclose = 0;
my $msg = ''; my $msg = '';
my $tail = ''; my $tail = '';
if ($buffer) { if ($buffer) {
for my $c ( split //, $buffer ) { for my $c ( split //, $buffer ) {
if ( $open == $close && $open > 0 ) { if ( $jsonopen == $jsonclose && $jsonopen > 0 ) {
$tail .= $c; $tail .= $c;
Log3 $name, 5, Log3 $name, 5,
"LGTV_WebOS ($name) - $open == $close && $open > 0"; "LGTV_WebOS ($name) - $jsonopen == $jsonclose && $jsonopen > 0";
} }
elsif ( ( $open == $close ) && ( $c ne '{' ) ) { elsif ( ( $jsonopen == $jsonclose ) && ( $c ne '{' ) ) {
Log3 $name, 5, Log3 $name, 5,
"LGTV_WebOS ($name) - Garbage character before message: " "LGTV_WebOS ($name) - Garbage character before message: "
@ -1567,19 +1569,19 @@ sub LGTV_WebOS_ParseMsg {
if ( $c eq '{' ) { if ( $c eq '{' ) {
$open++; $jsonopen++;
} }
elsif ( $c eq '}' ) { elsif ( $c eq '}' ) {
$close++; $jsonclose++;
} }
$msg .= $c; $msg .= $c;
} }
} }
if ( $open != $close ) { if ( $jsonopen != $jsonclose ) {
$tail = $msg; $tail = $msg;
$msg = ''; $msg = '';
@ -1598,7 +1600,7 @@ sub LGTV_WebOS_Header2Hash {
my ( $key, $value ) = split( ": ", $line ); my ( $key, $value ) = split( ": ", $line );
next if ( !$value ); next if ( !$value );
$value =~ s/^ //; $value =~ s/^ //x;
$hash{$key} = $value; $hash{$key} = $value;
} }
@ -1643,7 +1645,10 @@ sub LGTV_WebOS_PresenceRun {
"LGTV_WebOS ($name) - ping command returned with output:\n$tmp"; "LGTV_WebOS ($name) - ping command returned with output:\n$tmp";
$response = "$name|" $response = "$name|"
. ( . (
( $tmp =~ /\d+ [Bb]ytes (from|von)/ && !$tmp =~ /[Uu]nreachable/ ) (
$tmp =~ /\d+ [Bb]ytes (from|von)/x
&& !$tmp =~ /[Uu]nreachable/x
)
? "present" ? "present"
: "absent" : "absent"
); );
@ -1714,9 +1719,9 @@ sub LGTV_WebOS_WakeUp_Udp {
my ( $hash, $mac_addr, $host, $port ) = @_; my ( $hash, $mac_addr, $host, $port ) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
$port = 9 if ( !defined $port || $port !~ /^\d+$/ ); $port = 9 if ( !defined $port || $port !~ /^\d+$/x );
my $sock = new IO::Socket::INET( Proto => 'udp' ) or die "socket : $!"; my $sock = IO::Socket::INET->new( Proto => 'udp' ) or warn "socket : $!\n";
if ( !$sock ) { if ( !$sock ) {
Log3 $name, 3, Log3 $name, 3,
"Sub LGTV_WebOS_WakeUp_Udp ($name) - Can't create WOL socket"; "Sub LGTV_WebOS_WakeUp_Udp ($name) - Can't create WOL socket";
@ -1725,12 +1730,13 @@ sub LGTV_WebOS_WakeUp_Udp {
my $ip_addr = inet_aton($host); my $ip_addr = inet_aton($host);
my $sock_addr = sockaddr_in( $port, $ip_addr ); my $sock_addr = sockaddr_in( $port, $ip_addr );
$mac_addr =~ s/://g; $mac_addr =~ s/://xg;
my $packet = my $packet =
pack( 'C6H*', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, $mac_addr x 16 ); pack( 'C6H*', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, $mac_addr x 16 );
setsockopt( $sock, SOL_SOCKET, SO_BROADCAST, 1 ) or die "setsockopt : $!"; setsockopt( $sock, SOL_SOCKET, SO_BROADCAST, 1 )
send( $sock, $packet, 0, $sock_addr ) or die "send : $!"; or warn "setsockopt : $!\n";
send( $sock, $packet, 0, $sock_addr ) or warn "send : $!\n";
close($sock); close($sock);
return 1; return 1;
@ -1954,6 +1960,14 @@ sub LGTV_WebOS_WakeUp_Udp {
</ul> </ul>
</ul> </ul>
</ul> </ul>
<ul>
<ul>
<ul>
<li>pingPresence</li>
M&ouml;gliche Werte: 0 =&gt; presence via ping deaktivert, 1 =&gt; presence via ping aktiviert
</ul>
</ul>
</ul>
<ul> <ul>
<ul> <ul>
<ul> <ul>