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