Difference between revisions of "Controlling DirecTV Set Top Box (STB) via Network"

From MythTV Official Wiki
Jump to: navigation, search
Line 97: Line 97:
 
             print $res->content . "\n";
 
             print $res->content . "\n";
 
         }
 
         }
#print "Here 1\n";  
+
        #print "Here 1\n";  
sleep $sleep_sec;
+
        sleep $sleep_sec;
 
  #print "Here 2\n";         
 
  #print "Here 2\n";         
 
  exit 0;
 
  exit 0;

Revision as of 00:28, 6 November 2010

Summary

Some DirecTV set top boxes now allow certain operations via the DirecTV HTTP Server on port 8080. The H23 is one example. The set top box must be plugged in to the network in order for this to work.

Documentation on the internet is lacking at the moment, but it is possible currently to change the channel and to gather current (tuned) channel information. The attached perl script allows users to change the channel or gather current channel data. The DirecTV set top box always returns data in JSON.

Perl Script

Attached is my first crack at a script. I'm pretty green at perl so this is quite a hack, but it works. The script takes the following arguments:

Always list the IP address of the receiver first.
Next, type "tune" to change the channel, or "getTuned" to display the JSON for the current listing
If you chose "tune", now enter the channel number

I found that on my Ubuntu installation, I had to install the JSON library using CPAN. I followed these instructions:

sudo cpan
install JSON
exit

directv_http.pl

#!/usr/bin/perl
use LWP::UserAgent;
use JSON;

$ua = LWP::UserAgent->new;
$ua->agent("$0/0.1 " . $ua->agent);
# $ua->agent("Mozilla/8.0") # pretend we are very capable browser

# get args
$dtv_ip = $ARGV[0];
$sleep_sec = $ARGV[1];
$arg = $ARGV[2];
$chan_num = "";
$numArgs = $#ARGV + 1;
$tune = 1;
$minor = 0;

if($numArgs == 0)
{
    print "(10) Error: no command line arguments\n";
    exit 1;
}

if($arg eq "getTuned")
{
    $tune = 0;
}
elsif($arg eq "tune")
{
    if(($ARGV[3] =~ m/-/) == 1)
    {
        @chan_arr = split(/-/, $ARGV[3]);
        $chan_num = $chan_arr[0];
        $minor = $chan_arr[1];
    }
    else
    {
        $chan_num = $ARGV[3];
    }
    $tune = 1;
}
else
{
    print "(20) Error: command line argument invalid\n";
    exit 1;
}

$url = 'http://'.$dtv_ip.':8080/tv/tune?major='.$chan_num;
if($tune == 0)
{
    $url = 'http://'.$dtv_ip.':8080/tv/getTuned';
}
if($minor != 0)
{
    $url = 'http://'.$dtv_ip.':8080/tv/tune?major='.$chan_num.'&minor='.$minor;
}
$req = HTTP::Request->new(GET => $url);
$req->header('Accept' => 'text/html');

# send request
$res = $ua->request($req);

# check the outcome
if ($res->is_success) 
{
    #print $res->content."\n";
    $json = new JSON;
    $json_text = $json->decode($res->content);
    $check_ok = $json_text->{status}->{msg};
    #print "OK? ".$check_ok . "\n";
    if($check_ok eq "OK")
    {
        if($tune == 0)
        {
            print $res->content . "\n";
        }
        #print "Here 1\n"; 
        sleep $sleep_sec;
	 #print "Here 2\n";         
	 exit 0;
    }
    else
    {
        print "(30) Error: " . $check_ok . "\n";
        exit 1;
    }
} 
else 
{
    print "(40) Error: " . $res->status_line . "\n";
    exit 1;
}