From b25d01d52c75f8e43bccc41470d7929cfafb5371 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Sun, 17 Sep 2017 20:48:48 +0200 Subject: [PATCH 1/7] add Plex Reading Support, Wake On Lan Support --- 82_LGTV_WebOS.pm | 74 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 12 deletions(-) diff --git a/82_LGTV_WebOS.pm b/82_LGTV_WebOS.pm index 152c83b..67d1cb1 100644 --- a/82_LGTV_WebOS.pm +++ b/82_LGTV_WebOS.pm @@ -31,8 +31,19 @@ ################################# ######### Wichtige Hinweise und Links ################# - - +# +## Das JSON Modul immer in einem eval aufrufen +# $data = eval{decode_json($data)}; +# +# if($@){ +# Log3($SELF, 2, "$TYPE ($SELF) - error while request: $@"); +# +# readingsSingleUpdate($hash, "state", "error", 1); +# +# return; +# } +## +## ## # @@ -49,14 +60,14 @@ use MIME::Base64; use IO::Socket::INET; use Digest::SHA qw(sha1_hex); use JSON qw(decode_json encode_json); -use Encode qw(encode_utf8); +use Encode qw(encode_utf8 decode_utf8); use Blocking; -my $version = "0.6.0"; +my $version = "0.8.3"; @@ -93,6 +104,7 @@ sub LGTV_WebOS_Presence($); sub LGTV_WebOS_PresenceRun($); sub LGTV_WebOS_PresenceDone($); sub LGTV_WebOS_PresenceAborted($); +sub LGTV_WebOS_WakeUp_Udp($@); @@ -154,7 +166,8 @@ my %openApps = ( 'ARDMediathek' => 'ard.mediathek', 'Arte' => 'com.3827031.168353', 'WetterMeteo' => 'meteonews', - 'Notificationcenter' => 'com.webos.app.notificationcenter' + 'Notificationcenter' => 'com.webos.app.notificationcenter', + 'Plex' => 'cdp-30' ); my %openAppsPackageName = ( @@ -176,7 +189,8 @@ my %openAppsPackageName = ( 'ard.mediathek' => 'ARDMediathek', 'com.3827031.168353' => 'Arte', 'meteonews' => 'WetterMeteo', - 'com.webos.app.notificationcenter' => 'Notificationcenter' + 'com.webos.app.notificationcenter' => 'Notificationcenter', + 'cdp-30' => 'Plex' ); @@ -200,6 +214,7 @@ sub LGTV_WebOS_Initialize($) { $hash->{AttrList} = "disable:1 ". "channelGuide:1 ". "pingPresence:1 ". + "wakeOnLanMAC ". $readingFnAttributes; @@ -228,6 +243,7 @@ sub LGTV_WebOS_Define($$) { $hash->{helper}{device}{channelguide}{counter} = 0; $hash->{helper}{device}{registered} = 0; $hash->{helper}{device}{runsetcmd} = 0; + $hash->{helper}{device}{channelguide}{counter} = 'none'; Log3 $name, 3, "LGTV_WebOS ($name) - defined with host $host"; @@ -412,7 +428,7 @@ sub LGTV_WebOS_Set($@) { return "usage: screenMsg " if( @args < 1 ); my $msg = join(" ", @args); - $payload{$lgCommands{$cmd}->[1]} = $msg; + $payload{$lgCommands{$cmd}->[1]} = decode_utf8($msg); $uri = $lgCommands{$cmd}->[0]; } elsif($cmd eq 'on' or $cmd eq 'off') { @@ -421,7 +437,11 @@ sub LGTV_WebOS_Set($@) { if($cmd eq 'off') { $uri = $lgCommands{powerOff}; } elsif ($cmd eq 'on') { - $uri = $lgCommands{powerOn}; + if( AttrVal($name,'wakeOnLanMAC','none') ne 'none') { + LGTV_WebOS_WakeUp_Udp($hash,$hash->{HOST},AttrVal($name,'wakeOnLanMAC',0)); + } else { + $uri = $lgCommands{powerOn}; + } } } elsif($cmd eq '3D') { @@ -617,7 +637,7 @@ sub LGTV_WebOS_Read($) { my $buf; - Log3 $name, 4, "LGTV_WebOS ($name) - ReadFn gestartet"; + Log3 $name, 4, "LGTV_WebOS ($name) - ReadFn started"; $len = sysread($hash->{CD},$buf,10240); @@ -629,7 +649,7 @@ sub LGTV_WebOS_Read($) { } unless( defined $buf) { - Log3 $name, 3, "LGTV_WebOS ($name) - Keine Daten empfangen"; + Log3 $name, 3, "LGTV_WebOS ($name) - no data received"; return; } @@ -796,7 +816,10 @@ sub LGTV_WebOS_ResponseProcessing($$) { } my $decode_json = decode_json(encode_utf8($json)); - + if($@){ + Log3 $name, 3, "LGTV_WebOS ($name) - JSON error while request: $@"; + return; + } LGTV_WebOS_WriteReadings($hash,$decode_json); @@ -814,6 +837,7 @@ sub LGTV_WebOS_WriteReadings($$) { my $name = $hash->{NAME}; my $mute; my $response; + my %channelList; Log3 $name, 4, "LGTV_WebOS ($name) - Beginn Readings writing"; @@ -848,7 +872,7 @@ sub LGTV_WebOS_WriteReadings($$) { my $count = 0; foreach my $programList ( @{$decode_json->{payload}{programList}} ) { - + if($count < 1) { readingsBulkUpdate($hash,'channelCurrentTitle',$programList->{programName}); @@ -1392,6 +1416,32 @@ sub LGTV_WebOS_PresenceAborted($) { Log3 $name, 4, "Sub LGTV_WebOS_PresenceAborted ($name) - The BlockingCall Process terminated unexpectedly. Timedout!"; } +sub LGTV_WebOS_WakeUp_Udp($@) { + + my ($hash,$mac_addr,$host,$port) = @_; + my $name = $hash->{NAME}; + + # use the discard service if $port not passed in + if (!defined $port || $port !~ /^\d+$/ ) { $port = 9 } + + my $sock = new IO::Socket::INET(Proto=>'udp') or die "socket : $!"; + if(!$sock) { + Log3 $name, 3, "Sub LGTV_WebOS_WakeUp_Udp ($name) - Can't create WOL socket"; + return 1; + } + + my $ip_addr = inet_aton($host); + my $sock_addr = sockaddr_in($port, $ip_addr); + $mac_addr =~ s/://g; + 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 : $!"; + close ($sock); + + return 1; +} + ####### Presence Erkennung Ende ############ From 62f3abd8420cd6988647b341f93c49b6ce7a525c Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Sun, 17 Sep 2017 21:19:37 +0200 Subject: [PATCH 2/7] code clean --- 82_LGTV_WebOS.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/82_LGTV_WebOS.pm b/82_LGTV_WebOS.pm index 67d1cb1..4443085 100644 --- a/82_LGTV_WebOS.pm +++ b/82_LGTV_WebOS.pm @@ -558,7 +558,7 @@ sub LGTV_WebOS_Set($@) { } else { my $list = ""; - $list .= "connect:noArg pairing:noArg screenMsg mute:on,off volume:slider,0,1,100 volumeUp:noArg volumeDown:noArg channelDown:noArg channelUp:noArg getServiceList:noArg on:noArg off:noArg launchApp:Maxdome,AmazonVideo,YouTube,Netflix,TV,GooglePlay,Browser,Chilieu,TVCast,Smartshare,Scheduler,Miracast,TVGuide,Timemachine,ARDMediathek,Arte,WetterMeteo,Notificationcenter 3D:on,off stop:noArg play:noArg pause:noArg rewind:noArg fastForward:noArg clearInputList:noArg input:$inputs channel"; + $list .= "connect:noArg pairing:noArg screenMsg mute:on,off volume:slider,0,1,100 volumeUp:noArg volumeDown:noArg channelDown:noArg channelUp:noArg getServiceList:noArg on:noArg off:noArg launchApp:Maxdome,AmazonVideo,YouTube,Netflix,TV,GooglePlay,Browser,Chilieu,TVCast,Smartshare,Scheduler,Miracast,TVGuide,Timemachine,ARDMediathek,Arte,WetterMeteo,Notificationcenter,Plex 3D:on,off stop:noArg play:noArg pause:noArg rewind:noArg fastForward:noArg clearInputList:noArg input:$inputs channel"; return "Unknown argument $cmd, choose one of $list"; } From 80368fc0be6b10fff9b25abfb83913575152aa78 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 18 Sep 2017 11:12:03 +0200 Subject: [PATCH 3/7] fix wakeUpOnLan crashe --- 82_LGTV_WebOS.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/82_LGTV_WebOS.pm b/82_LGTV_WebOS.pm index 4443085..c4b0ae0 100644 --- a/82_LGTV_WebOS.pm +++ b/82_LGTV_WebOS.pm @@ -438,7 +438,7 @@ sub LGTV_WebOS_Set($@) { $uri = $lgCommands{powerOff}; } elsif ($cmd eq 'on') { if( AttrVal($name,'wakeOnLanMAC','none') ne 'none') { - LGTV_WebOS_WakeUp_Udp($hash,$hash->{HOST},AttrVal($name,'wakeOnLanMAC',0)); + LGTV_WebOS_WakeUp_Udp($hash,AttrVal($name,'wakeOnLanMAC',0),$hash->{HOST}); } else { $uri = $lgCommands{powerOn}; } From 336c3e39a324e0c6cd94736b01f300b484f54488 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 18 Sep 2017 12:27:35 +0200 Subject: [PATCH 4/7] insert return Command for wakeOnLan Set --- 82_LGTV_WebOS.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/82_LGTV_WebOS.pm b/82_LGTV_WebOS.pm index c4b0ae0..82d0d21 100644 --- a/82_LGTV_WebOS.pm +++ b/82_LGTV_WebOS.pm @@ -67,7 +67,7 @@ use Blocking; -my $version = "0.8.3"; +my $version = "0.8.4"; @@ -439,6 +439,7 @@ sub LGTV_WebOS_Set($@) { } elsif ($cmd eq 'on') { if( AttrVal($name,'wakeOnLanMAC','none') ne 'none') { LGTV_WebOS_WakeUp_Udp($hash,AttrVal($name,'wakeOnLanMAC',0),$hash->{HOST}); + return; } else { $uri = $lgCommands{powerOn}; } From d94690b16a558d06e10f74541238388512d82b87 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 18 Sep 2017 13:30:04 +0200 Subject: [PATCH 5/7] add attribut wakeOnLanBroadcast --- 82_LGTV_WebOS.pm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/82_LGTV_WebOS.pm b/82_LGTV_WebOS.pm index 82d0d21..4da8fcf 100644 --- a/82_LGTV_WebOS.pm +++ b/82_LGTV_WebOS.pm @@ -67,7 +67,7 @@ use Blocking; -my $version = "0.8.4"; +my $version = "0.8.5"; @@ -215,6 +215,7 @@ sub LGTV_WebOS_Initialize($) { "channelGuide:1 ". "pingPresence:1 ". "wakeOnLanMAC ". + "wakeOnLanBroadcast ". $readingFnAttributes; @@ -437,8 +438,8 @@ sub LGTV_WebOS_Set($@) { if($cmd eq 'off') { $uri = $lgCommands{powerOff}; } elsif ($cmd eq 'on') { - if( AttrVal($name,'wakeOnLanMAC','none') ne 'none') { - LGTV_WebOS_WakeUp_Udp($hash,AttrVal($name,'wakeOnLanMAC',0),$hash->{HOST}); + if( AttrVal($name,'wakeOnLanMAC','none') ne 'none' and AttrVal($name,'wakeOnLanBroadcast','none') ne 'none') { + LGTV_WebOS_WakeUp_Udp($hash,AttrVal($name,'wakeOnLanMAC',0),AttrVal($name,'wakeOnLanBroadcast',0)); return; } else { $uri = $lgCommands{powerOn}; @@ -1422,8 +1423,10 @@ sub LGTV_WebOS_WakeUp_Udp($@) { my ($hash,$mac_addr,$host,$port) = @_; my $name = $hash->{NAME}; + $host = '255.255.255.255' if (!defined $host); + # use the discard service if $port not passed in - if (!defined $port || $port !~ /^\d+$/ ) { $port = 9 } + $port = 9 if (!defined $port || $port !~ /^\d+$/ ); my $sock = new IO::Socket::INET(Proto=>'udp') or die "socket : $!"; if(!$sock) { From f96bfe576f3075eb7c7f8d9fb5ec6af0859f1e5a Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 18 Sep 2017 13:59:10 +0200 Subject: [PATCH 6/7] set 255.255.255.255 to broadcast default --- 82_LGTV_WebOS.pm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/82_LGTV_WebOS.pm b/82_LGTV_WebOS.pm index 4da8fcf..3b3ed5d 100644 --- a/82_LGTV_WebOS.pm +++ b/82_LGTV_WebOS.pm @@ -67,7 +67,7 @@ use Blocking; -my $version = "0.8.5"; +my $version = "0.8.6"; @@ -438,8 +438,8 @@ sub LGTV_WebOS_Set($@) { if($cmd eq 'off') { $uri = $lgCommands{powerOff}; } elsif ($cmd eq 'on') { - if( AttrVal($name,'wakeOnLanMAC','none') ne 'none' and AttrVal($name,'wakeOnLanBroadcast','none') ne 'none') { - LGTV_WebOS_WakeUp_Udp($hash,AttrVal($name,'wakeOnLanMAC',0),AttrVal($name,'wakeOnLanBroadcast',0)); + if( AttrVal($name,'wakeOnLanMAC','none') ne 'none' ) { + LGTV_WebOS_WakeUp_Udp($hash,AttrVal($name,'wakeOnLanMAC',0),AttrVal($name,'wakeOnLanBroadcast','255.255.255.255')); return; } else { $uri = $lgCommands{powerOn}; @@ -1423,9 +1423,7 @@ sub LGTV_WebOS_WakeUp_Udp($@) { my ($hash,$mac_addr,$host,$port) = @_; my $name = $hash->{NAME}; - $host = '255.255.255.255' if (!defined $host); - - # use the discard service if $port not passed in + $port = 9 if (!defined $port || $port !~ /^\d+$/ ); my $sock = new IO::Socket::INET(Proto=>'udp') or die "socket : $!"; From fe5c317330494303ae80198fdee0315fe3d4b32e Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 18 Sep 2017 14:46:57 +0200 Subject: [PATCH 7/7] Version 1.0.0 add wakeOnLan Funktion in stable --- 82_LGTV_WebOS.pm | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/82_LGTV_WebOS.pm b/82_LGTV_WebOS.pm index 3b3ed5d..1882562 100644 --- a/82_LGTV_WebOS.pm +++ b/82_LGTV_WebOS.pm @@ -67,7 +67,7 @@ use Blocking; -my $version = "0.8.6"; +my $version = "1.0.0"; @@ -1547,6 +1547,18 @@ sub LGTV_WebOS_WakeUp_Udp($@) { current state of ping presence from TV. create a reading presence with values absent or present. +
    +
      +
    • wakeOnLanMAC
    • + Network MAC Address of the LG TV Networkdevice. +
    +
+
    +
      +
    • wakeOnLanBroadcast
    • + Broadcast Address of the Network - wakeOnLanBroadcast <network>.255 +
    +
=end html @@ -1638,6 +1650,22 @@ sub LGTV_WebOS_WakeUp_Udp($@) {
    Mögliche Werte: 0 => keine zyklischen TV-Guide-Updates, 1 => zyklische TV-Guide-Updates
+
    +
      +
        +
      • wakeOnLanMAC
      • + MAC Addresse der Netzwerkkarte vom LG TV +
      +
    +
+
    +
      +
        +
      • wakeOnLanBroadcast
      • + Broadcast Netzwerkadresse - wakeOnLanBroadcast <netzwerk>.255 +
      +
    +



Generierte Readings/Events: