# $Id$ ############################################################################## # # 70_VIERA.pm # # a module to send messages or commands to a Panasonic TV # inspired by Samsung TV Module from Gabriel Bentele # written 2013 by Tobias Vaupel # # # Version = 1.23 # # Version History: # - 1.23 - 2014-08-01 # -- Add parameter "HDMI1" - "HDMI4" for command remoteControl to select HDMI input directly # -- Add command "input" to select a HDMI port, TV or SD-Card as source # # - 1.22 - 2013-12-28 # -- fixed set command remoteControl # # - 1.21 - 2013-08-19 # -- Log() deprecated/replaced by Log3() # -- GetStatus() is called after set volume/mute to update readings immediately # # - 1.20 - 2013-08-16 # -- added support according to http://www.fhemwiki.de/wiki/DevelopmentGuidelinesAV # # - 1.11 - 2013-08-13 # -- added "noArg" at get/set-command # -- changed format of return() in VIERA_Get() for get-command dropdown menu in FHEMWEB # # - 1.10 - 2013-06-29 # -- Added support for module 95_remotecontrol # -- New functions: sub VIERA_RClayout_TV(); sub VIERA_RCmakenotify($$); # -- Updated VIERA_Initialize for remotecontrol # # - 1.00 - 2013-03-16 # -- First release # ############################################################################## package main; use strict; use warnings; use IO::Socket::INET; use feature qw/say switch/; use Time::HiRes qw(gettimeofday sleep); ######################### # Forward declaration for remotecontrol module sub VIERA_RClayout_TV(); sub VIERA_RCmakenotify($$); my %VIERA_remoteControl_args = ( "NRC_CH_DOWN-ONOFF" => "Channel down", "NRC_CH_UP-ONOFF" => "Channel up", "NRC_VOLUP-ONOFF" => "Volume up", "NRC_VOLDOWN-ONOFF" => "Volume down", "NRC_MUTE-ONOFF" => "Mute", "NRC_TV-ONOFF" => "TV", "NRC_CHG_INPUT-ONOFF" => "AV", "NRC_RED-ONOFF" => "Red", "NRC_GREEN-ONOFF" => "Green", "NRC_YELLOW-ONOFF" => "Yellow", "NRC_BLUE-ONOFF" => "Blue", "NRC_VTOOLS-ONOFF" => "VIERA tools", "NRC_CANCEL-ONOFF" => "Cancel / Exit", "NRC_SUBMENU-ONOFF" => "Option", "NRC_RETURN-ONOFF" => "Return", "NRC_ENTER-ONOFF" => "Control Center click / enter", "NRC_RIGHT-ONOFF" => "Control RIGHT", "NRC_LEFT-ONOFF" => "Control LEFT", "NRC_UP-ONOFF" => "Control UP", "NRC_DOWN-ONOFF" => "Control DOWN", "NRC_3D-ONOFF" => "3D button", "NRC_SD_CARD-ONOFF" => "SD-card", "NRC_DISP_MODE-ONOFF" => "Display mode / Aspect ratio", "NRC_MENU-ONOFF" => "Menu", "NRC_INTERNET-ONOFF" => "VIERA connect", "NRC_VIERA_LINK-ONOFF"=> "VIERA link", "NRC_EPG-ONOFF" => "Guide / EPG", "NRC_TEXT-ONOFF" => "Text / TTV", "NRC_STTL-ONOFF" => "STTL / Subtitles", "NRC_INFO-ONOFF" => "Info", "NRC_INDEX-ONOFF" => "TTV index", "NRC_HOLD-ONOFF" => "TTV hold / image freeze", "NRC_R_TUNE-ONOFF" => "Last view", "NRC_POWER-ONOFF" => "Power off", "NRC_REW-ONOFF" => "Rewind", "NRC_PLAY-ONOFF" => "Play", "NRC_FF-ONOFF" => "Fast forward", "NRC_SKIP_PREV-ONOFF" => "Skip previous", "NRC_PAUSE-ONOFF" => "Pause", "NRC_SKIP_NEXT-ONOFF" => "Skip next", "NRC_STOP-ONOFF" => "Stop", "NRC_REC-ONOFF" => "Record", "NRC_D1-ONOFF" => "Digit 1", "NRC_D2-ONOFF" => "Digit 2", "NRC_D3-ONOFF" => "Digit 3", "NRC_D4-ONOFF" => "Digit 4", "NRC_D5-ONOFF" => "Digit 5", "NRC_D6-ONOFF" => "Digit 6", "NRC_D7-ONOFF" => "Digit 7", "NRC_D8-ONOFF" => "Digit 8", "NRC_D9-ONOFF" => "Digit 9", "NRC_D0-ONOFF" => "Digit 0", "NRC_P_NR-ONOFF" => "P-NR (Noise reduction)", "NRC_R_TUNE-ONOFF" => "Seems to do the same as INFO", "NRC_HDMI1" => "Switch to HDMI input 1", "NRC_HDMI2" => "Switch to HDMI input 2", "NRC_HDMI3" => "Switch to HDMI input 3", "NRC_HDMI4" => "Switch to HDMI input 4", ); sub VIERA_Initialize($){ my ($hash) = @_; $hash->{DefFn} = "VIERA_Define"; $hash->{SetFn} = "VIERA_Set"; $hash->{GetFn} = "VIERA_Get"; $hash->{UndefFn} = "VIERA_Undefine"; $hash->{AttrList} = $readingFnAttributes; $data{RC_layout}{VIERA_TV} = "VIERA_RClayout_TV"; $data{RC_makenotify}{VIERA} = "VIERA_RCmakenotify"; } sub VIERA_Define($$){ my ($hash, $def) = @_; my @args = split("[ \t][ \t]*", $def); my $name = $hash->{NAME}; if(int(@args) < 3 && int(@args) > 4) { my $msg = "wrong syntax: define VIERA []"; Log3 $name, 2, "VIERA: $msg"; return $msg; } $hash->{helper}{HOST} = $args[2]; readingsSingleUpdate($hash,"state","Initialized",1); if(defined($args[3]) and $args[3] > 10) { $hash->{helper}{INTERVAL}=$args[3]; } else{ $hash->{helper}{INTERVAL}=30; } CommandAttr(undef,$name.' webCmd off') if( !defined( AttrVal($hash->{NAME}, "webCmd", undef) ) ); Log3 $name, 2, "VIERA: defined with host: $hash->{helper}{HOST} and interval: $hash->{helper}{INTERVAL}"; InternalTimer(gettimeofday()+$hash->{helper}{INTERVAL}, "VIERA_GetStatus", $hash, 0); return undef; } sub VIERA_Set($@){ my ($hash, @a) = @_; my $name = $hash->{NAME}; my $host = $hash->{helper}{HOST}; my $count = @a; my $key = ""; my $tab = ""; my $usage = "choose one of off:noArg mute:on,off " . "remoteControl:" . join(",", sort keys %VIERA_remoteControl_args) . " " . "volume:slider,0,1,100 volumeUp:noArg volumeDown:noArg ". "channel channelUp:noArg channelDown:noArg input:hdmi1,hdmi2,hdmi3,hdmi4,sdCard,tv"; $usage =~ s/(NRC_|-ONOFF)//g; my $what = lc($a[1]); return "VIERA: Device is not present or reachable, power on or check ethernet connection" if(ReadingsVal($name,"presence","absent")ne "present" && $what ne "?"); return "VIERA: No argument given, $usage" if(!defined($a[1])); my $state = lc($a[2]) if(defined($a[2])); given($what) { when("mute"){ Log3 $name, 3, "VIERA: Set mute $state"; if ($state eq "on") {$state = 1;} else {$state = 0;} VIERA_connection(VIERA_BuildXML_RendCtrl($hash, "Set", "Mute", $state), $host); VIERA_GetStatus($hash, 1); break; } when("volume"){ return "VIERA: Volume range is too high! Use Value 0 till 100 for volume." if($state < 0 || $state > 100); Log3 $name, 3, "VIERA: Set volume $state"; VIERA_connection(VIERA_BuildXML_RendCtrl($hash, "Set", "Volume", $state), $host); VIERA_GetStatus($hash, 1); break; } when("volumeup"){ return "VIERA: Volume range is too high!" if(ReadingsVal($name, "volume", "0") > 100); Log3 $name, 3, "VIERA: Set volumeUp"; VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"VOLUP"), $host); VIERA_GetStatus($hash, 1); break; } when("volumedown"){ return "VIERA: Volume range is too low!" if(ReadingsVal($name, "volume", "0") < 1); Log3 $name, 3, "VIERA: Set volumeDown"; VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"VOLDOWN"), $host); VIERA_GetStatus($hash, 1); break; } when("channel"){ return "VIERA: Channel is too high or low!" if($state < 1 || $state > 9999); Log3 $name, 3, "VIERA: Set channel $state"; for(my $i = 0; $i <= length($state)-1; $i++) { VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"D" . substr($state, $i, 1)), $host); sleep 0.1; } VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"ENTER"), $host); break; } when("channelup"){ Log3 $name, 3, "VIERA: Set channelUp"; VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"CH_UP"), $host); break; } when("channeldown"){ Log3 $name, 3, "VIERA: Set channelDown"; VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"CH_DOWN"), $host); break; } when("remotecontrol"){ if($state eq "?"){ $usage = "choose one of the states:\n"; foreach $key (sort keys %VIERA_remoteControl_args){ if(length($key) < 17){ $tab = "\t\t"; }else{ $tab = "\t"; } $usage .= "$key $tab=> $VIERA_remoteControl_args{$key}\n"; } $usage =~ s/(NRC_|-ONOFF)//g; return $usage; } else{ $state = uc($state); Log3 $name, 3, "VIERA: Set remoteControl $state"; VIERA_connection(VIERA_BuildXML_NetCtrl($hash,$state), $host); } break; } when("off"){ Log3 $name, 3, "VIERA: Set off"; VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"POWER"), $host); break; } when("statusrequest"){ Log3 $name, 3, "VIERA: Set statusRequest"; VIERA_GetStatus($hash, 1); break; } when("input"){ $state = uc($state); return "VIERA: Input $state isn't available." if($state ne "HDMI1" && $state ne "HDMI2" && $state ne "HDMI3" && $state ne "HDMI4" && $state ne "SDCARD" && $state ne "TV"); $state = "SD_CARD" if ($state eq "SDCARD"); Log3 $name, 3, "VIERA: Set input $state"; VIERA_connection(VIERA_BuildXML_NetCtrl($hash,$state), $host); break; } when("?"){ return "$usage"; break; } default{ Log3 $name, 3, "VIERA: Unknown argument $what, $usage"; return "Unknown argument $what, $usage"; }; } return undef; } sub VIERA_Get($@){ my ($hash, @a) = @_; my $what; my $usage = "choose one of mute:noArg volume:noArg power:noArg presence:noArg"; my $name = $hash->{NAME}; return "VIERA: No argument given, $usage" if(int(@a) != 2); $what = lc($a[1]); if($what =~ /^(volume|mute|power|presence)$/) { if (defined($hash->{READINGS}{$what})) { ReadingsVal($name, $what, "undefined"); } else{ return "no such reading: $what"; } } else{ return "Unknown argument $what, $usage"; } } sub VIERA_Undefine($$){ my($hash, $name) = @_; # Stop the internal GetStatus-Loop and exist RemoveInternalTimer($hash); return undef; } sub VIERA_GetStatus($;$){ my ($hash, $local) = @_; my $name = $hash->{NAME}; my $host = $hash->{helper}{HOST}; #if $local is set to 1 just fetch informations from device without interupting InternalTimer $local = 0 unless(defined($local)); InternalTimer(gettimeofday()+$hash->{helper}{INTERVAL}, "VIERA_GetStatus", $hash, 0) unless($local == 1); return "" if(!defined($hash->{helper}{HOST}) or !defined($hash->{helper}{INTERVAL})); my $returnVol = VIERA_connection(VIERA_BuildXML_RendCtrl($hash, "Get", "Volume", ""), $host); Log3 $name, 5, "VIERA: GetStatusVol-Request returned: $returnVol" if(defined($returnVol)); if(not defined($returnVol) or $returnVol eq "") { Log3 $name, 4, "VIERA: GetStatusVol-Request NO SOCKET!"; if( ReadingsVal($name,"state","absent") ne "absent") { readingsBeginUpdate($hash); readingsBulkUpdate($hash, "state", "absent"); readingsBulkUpdate($hash, "power", "off"); readingsBulkUpdate($hash, "presence", "absent"); readingsEndUpdate($hash, 1); } return; } my $returnMute = VIERA_connection(VIERA_BuildXML_RendCtrl($hash, "Get", "Mute", ""), $host); Log3 $name, 5, "VIERA: GetStatusMute-Request returned: $returnMute" if(defined($returnMute)); if(not defined($returnMute) or $returnMute eq "") { Log3 $name, 4, "VIERA: GetStatusMute-Request NO SOCKET!"; if( ReadingsVal($name,"state","absent") ne "absent") { readingsBeginUpdate($hash); readingsBulkUpdate($hash, "state", "absent"); readingsBulkUpdate($hash, "power", "off"); readingsBulkUpdate($hash, "presence", "absent"); readingsEndUpdate($hash, 1); } return; } readingsBeginUpdate($hash); if($returnVol =~ /(.+)<\/CurrentVolume>/){ Log3 $name, 4, "VIERA: GetStatus-Set reading volume to $1"; if( $1 != ReadingsVal($name, "volume", "0") ) {readingsBulkUpdate($hash, "volume", $1);} } if($returnMute =~ /(.+)<\/CurrentMute>/){ my $myMute = $1; if ($myMute == 0) { $myMute = "off"; } else { $myMute = "on";} Log3 $name, 4, "VIERA: GetStatus-Set reading mute to $myMute"; if( $myMute ne ReadingsVal($name, "mute", "0") ) {readingsBulkUpdate($hash, "mute", $myMute);} } if( ReadingsVal($name,"state","absent") ne "on") { readingsBulkUpdate($hash, "state", "on"); readingsBulkUpdate($hash, "power", "on"); readingsBulkUpdate($hash, "presence", "present"); } readingsEndUpdate($hash, 1); #Log3 $name, 4, "VIERA $name: $hash->{STATE}"; return $hash->{STATE}; } sub VIERA_connection($$){ my $tmp = shift ; my $TV = shift; my $buffer = ""; my $tmp2 = ""; my $sock = new IO::Socket::INET ( PeerAddr => $TV, PeerPort => '55000', Proto => 'tcp', Timeout => 2 ); #Log3 $name, 5, "VIERA: connection message: $tmp"; if(defined ($sock)){ print $sock $tmp; my $buff =""; while ((read $sock, $buff, 1) > 0){ $buffer .= $buff; } my @tmp2 = split (/\n/,$buffer); #Log3 $name, 4, "VIERA: $TV response: $tmp2[0]"; #Log3 $name, 5, "VIERA: $TV buffer response: $buffer"; $sock->close(); return $buffer; } else{ #Log3 $name, 4, "VIERA: $TV: not able to open socket"; return undef; } } ##################################### # Callback from 95_remotecontrol for command makenotify. sub VIERA_RCmakenotify($$) { my ($nam, $ndev) = @_; my $nname="notify_$nam"; fhem("define $nname notify $nam set $ndev remoteControl ".'$EVENT',1); Log3 undef, 2, "[remotecontrol:VIERA] Notify created: $nname"; return "Notify created by VIERA: $nname"; } ##################################### # Default-layout for panasonic TV (maybe other VIERA devices will have other layouts) sub VIERA_RClayout_TV() { my @row; $row[0]="power:POWEROFF2,TV, CHG_INPUT:HDMI"; $row[1]="MENU, disp_mode:ASPECT,epg:GUIDE"; $row[2]="VIERA_LINK,VTOOLS,INTERNET"; $row[3]=":blank,:blank,:blank"; $row[4]="INFO:INFO2,UP,cancel:EXIT"; $row[5]="LEFT,ENTER,RIGHT"; $row[6]="SUBMENU,DOWN,RETURN"; $row[7]=":blank,:blank,:blank"; $row[8]="d1:1,d2:2,d3:3"; $row[9]="d4:4,d5:5,d6:6"; $row[10]="d7:7,d8:8,d9:9"; $row[11]="MUTE,d0:0,r_tune:PRECH"; $row[12]=":blank,:blank,:blank"; $row[13]="VOLUP,:blank,ch_up:CHUP"; $row[14]=":VOL,:blank,:PROG"; $row[15]="VOLDOWN,:blank,ch_down:CHDOWN"; $row[16]=":blank,:blank,:blank"; $row[17]="rew:REWIND,PLAY,FF"; $row[18]="STOP,PAUSE,REC"; $row[19]="attr rc_iconpath icons/remotecontrol"; $row[20]="attr rc_iconprefix black_btn_"; return @row; } sub VIERA_BuildXML_NetCtrl($$){ my ($hash, $command) = @_; my $host = $hash->{helper}{HOST}; my $callsoap = ""; my $message = ""; my $head = ""; my $size = ""; $callsoap .= ""; $callsoap .= ""; $callsoap .= ""; $callsoap .= ""; $callsoap .= "NRC_$command-ONOFF"; $callsoap .= ""; $callsoap .= ""; $callsoap .= ""; $size = length($callsoap); $head .= "POST /nrc/control_0 HTTP/1.1\r\n"; $head .= "Host: $host:55000\r\n"; $head .= "SOAPACTION: \"urn:panasonic-com:service:p00NetworkControl:1#X_SendKey\"\r\n"; $head .= "Content-Type: text/xml; charset=\"utf-8\"\r\n"; $head .= "Content-Length: $size\r\n"; $head .= "\r\n"; $message .= $head; $message .= $callsoap; Log3 $hash, 5, "VIERA: Building XML SOAP (NetworkControl) for command $command to host $host:\n$message"; return $message; } sub VIERA_BuildXML_RendCtrl($$$$){ my ($hash, $methode, $command, $value) = @_; my $host = $hash->{helper}{HOST}; my $callsoap = ""; my $message = ""; my $head = ""; my $size = ""; Log3 $hash, 5, "DEBUG: $command with $value to $host"; $callsoap .= "\r\n"; $callsoap .= "\r\n"; $callsoap .= "\r\n"; $callsoap .= "\r\n"; $callsoap .= "0\r\n"; $callsoap .= "Master\r\n"; $callsoap .= "$value\r\n" if(defined($value)); $callsoap .= "\r\n"; $callsoap .= "\r\n"; $callsoap .= "\r\n"; $size = length($callsoap); $head .= "POST /dmr/control_0 HTTP/1.1\r\n"; $head .= "Host: $host:55000\r\n"; $head .= "SOAPACTION: \"urn:schemas-upnp-org:service:RenderingControl:1#$methode$command\"\r\n"; $head .= "Content-Type: text/xml; charset=\"utf-8\"\r\n"; $head .= "Content-Length: $size\r\n"; $head .= "\r\n"; $message .= $head; $message .= $callsoap; Log3 $hash, 5, "VIERA: Building XML SOAP (RenderingControl) for command $command with value $value to host $host:\n$message"; return $message; } 1; =pod =begin html

VIERA

    Define
      define <name> VIERA <host> [<interval>]

      This module controls Panasonic TV device over ethernet. It's possible to power down the tv, change volume or mute/unmute the TV. Also this modul is simulating the remote control and you are able to send different command buttons actions of remote control. The module is tested with Panasonic plasma TV tx-p50vt30e

      Defining a VIERA device will schedule an internal task (interval can be set with optional parameter <interval> in seconds, if not set, the value is 30 seconds), which periodically reads the status of volume and mute status and triggers notify/filelog commands.

      Example:
        define myTV1 VIERA 192.168.178.20

        define myTV1 VIERA 192.168.178.20 60 #with custom interval of 60 seconds

    Set
      set <name> <command> [<value>]

      Currently, the following commands are defined.
        off
        mute [on|off]
        volume [0-100]
        volumeUp
        volumeDown
        channel [1-9999]
        channelUp
        channelDown
        statusRequest
        remoteControl <command>

      Remote control (depending on your model, maybe)
      For this application the following commands are available:
        3D => 3D button
        BLUE => Blue
        CANCEL => Cancel / Exit
        CHG_INPUT => AV
        CH_DOWN => Channel down
        CH_UP => Channel up
        D0 => Digit 0
        D1 => Digit 1
        D2 => Digit 2
        D3 => Digit 3
        D4 => Digit 4
        D5 => Digit 5
        D6 => Digit 6
        D7 => Digit 7
        D8 => Digit 8
        D9 => Digit 9
        DISP_MODE => Display mode / Aspect ratio
        DOWN => Control DOWN
        ENTER => Control Center click / enter
        EPG => Guide / EPG
        FF => Fast forward
        GREEN => Green
        HOLD => TTV hold / image freeze
        INDEX => TTV index
        INFO => Info
        INTERNET => VIERA connect
        LEFT => Control LEFT
        MENU => Menu
        MUTE => Mute
        PAUSE => Pause
        PLAY => Play
        POWER => Power off
        P_NR => P-NR (Noise reduction)
        REC => Record
        RED => Red
        RETURN => Return
        REW => Rewind
        RIGHT => Control RIGHT
        R_TUNE => Seems to do the same as INFO
        SD_CARD => SD-card
        SKIP_NEXT => Skip next
        SKIP_PREV => Skip previous
        STOP => Stop
        STTL => STTL / Subtitles
        SUBMENU => Option
        TEXT => Text / TTV
        TV => TV
        UP => Control UP
        VIERA_LINK => VIERA link
        VOLDOWN => Volume down
        VOLUP => Volume up
        VTOOLS => VIERA tools
        YELLOW => Yellow

      Example:
        set <name> mute on
        set <name> volume 20
        set <name> remoteControl CH_DOWN

      Notes:
        Activate volume remotecontrol by DLNA: Menu -> Setup -> Network Setup -> Network Link Settings -> DLNA RemoteVolume -> On

    Get
      get <name> <what>

      Currently, the following commands are defined and return the current state of the TV.
        mute
        volume
        power
        presence

    Attributes
      N/A

    Generated events:
    • volume
    • mute
    • presence
    • power
    • state
=end html =begin html_DE

VIERA

    Define
      define <name> VIERA <host> [<interval>]

      Dieses Modul steuert einen Panasonic Fernseher über das Netzwerk. Es ist möglich den Fernseher auszuschalten, die Lautstärke zu ändern oder zu muten bzw. unmuten. Dieses Modul kann zusätzlich die Fernbedienung simulieren. Somit können also die Schaltaktionen einer Fernbedienung simuliert werden. Getestet wurde das Modul mit einem Panasonic Plasma TV tx-p50vt30e

      Beim definieren des Gerätes in FHEM wird ein interner Timer gestartet, welcher zyklisch alle 30 Sekunden den Status der Lautstärke und des Mute-Zustand ausliest. Das Intervall des Timer kann über den Parameter <interval> geändert werden. Wird kein Interval angegeben, liest das Modul alle 30 Sekunden die Werte aus und triggert ein notify.

      Beispiel:
        define myTV1 VIERA 192.168.178.20

        define myTV1 VIERA 192.168.178.20 60 #Mit einem Interval von 60 Sekunden

    Set
      set <name> <command> [<value>]

      Zur Zeit sind die folgenden Befehle implementiert:
        off
        mute [on|off]
        volume [0-100]
        volumeUp
        volumeDown
        channel [1-9999]
        channelUp
        channelDown
        statusRequest
        remoteControl <command>

      Fernbedienung (Kann vielleicht nach Modell variieren)
      Das Modul hat die folgenden Fernbedienbefehle implementiert:
        3D => 3D Knopf
        BLUE => Blau
        CANCEL => Cancel / Exit
        CHG_INPUT => AV
        CH_DOWN => Kanal runter
        CH_UP => Kanal hoch
        D0 => Ziffer 0
        D1 => Ziffer 1
        D2 => Ziffer 2
        D3 => Ziffer 3
        D4 => Ziffer 4
        D5 => Ziffer 5
        D6 => Ziffer 6
        D7 => Ziffer 7
        D8 => Ziffer 8
        D9 => Ziffer 9
        DISP_MODE => Anzeigemodus / Seitenverhältnis
        DOWN => Navigieren runter
        ENTER => Navigieren enter
        EPG => Guide / EPG
        FF => Vorspulen
        GREEN => Grün
        HOLD => Bild einfrieren
        INDEX => TTV index
        INFO => Info
        INTERNET => VIERA connect
        LEFT => Navigieren links
        MENU => Menü
        MUTE => Mute
        PAUSE => Pause
        PLAY => Play
        POWER => Power off
        P_NR => P-NR (Geräuschreduzierung)
        REC => Aufnehmen
        RED => Rot
        RETURN => Enter
        REW => Zurückspulen
        RIGHT => Navigieren Rechts
        R_TUNE => Vermutlich die selbe Funktion wie INFO
        SD_CARD => SD-card
        SKIP_NEXT => Skip next
        SKIP_PREV => Skip previous
        STOP => Stop
        STTL => Untertitel
        SUBMENU => Option
        TEXT => TeleText
        TV => TV
        UP => Navigieren Hoch
        VIERA_LINK => VIERA link
        VOLDOWN => Lauter
        VOLUP => Leiser
        VTOOLS => VIERA tools
        YELLOW => Gelb

      Beispiel:
        set <name> mute on
        set <name> volume 20
        set <name> remoteControl CH_DOWN

      Anmerkung:
        Aktivieren von Fernbedienung der Lautstärke per DLNA: Menü -> Setup -> Netzwerk-Setup -> Netzwerkverbindungsein. -> DLNA-Fernbed. Lautst. -> Ein

    Get
      get <name> <what>

      Die folgenden Befehle sind definiert und geben den entsprechenden Wert zurück, der vom Fernseher zurückgegeben wurde.
        mute
        volume
        power
        presence

    Attribute
      N/A

    Generierte events:
    • volume
    • mute
    • presence
    • power
    • state
=end html_DE =cut