wink.pl
Last modified by Richard Johnson on 2018/08/01 00:46
#!/usr/bin/perl -w
#
use Time::Local "timelocal";
#use XML::Parser;
#use XML::Simple;
#use IO::Handle;
use Data::Dumper;
#use URI::Escape;
use lib "/opt/local/lib/perl5/site_perl/5.12.4";
use JSON;
#require HTTP::Request;
require LWP::UserAgent;
my $host = '';
#
# Get my token
#
my $URL = $host . '/oauth2/token';
my %data = ('client_id' => 'my_client_id_from wink',
'client_secret' => 'my_client_secret_from_wink',
'username' => 'my_wink_account_email',
'password' => 'my_wink_account_password',
'grant_type' => 'password');
my $json = encode_json \%data;
my $h = HTTP::Headers->new(
Content_Length => length($json),
Content_Type => 'application/json'
);
my $browser = LWP::UserAgent->new();
my $r = HTTP::Request->new('POST', $URL, $h, $json);
my $response = $browser->request($r);
#die 'Error ' unless $response->is_success;
# $browser->default_header(content_type => "application/json");
#print $response;
#print $response->content_type;
#print $response->as_string;
#print $response->content;
# Parse the JSON response
$resp = decode_json $response->content;
#print Dumper($resp);
#print $resp->{access_token}, "\n";
#print $resp->{data}->{access_token}, "\n";
#
# Have my token, now get device list
#
$token = $resp->{access_token};
#$refresh = $resp->{refresh_token};
# Now create my new query with this access token
#$URL = $host . '/users/me/wink_devices';
$URL = $host . '/users/me/light_bulbs';
# my %data = ('Authorization' => 'Bearer ' . $resp->{access_token});
# my $json = encode_json \%data;
#print "Getting device list, query is\n";
# print $json;
#print "\n";
$h = HTTP::Headers->new(
Content_Type => 'application/json',
Authorization => 'Bearer ' . $resp->{access_token}
);
$browser = LWP::UserAgent->new();
$r = HTTP::Request->new('GET', $URL, $h);
$response = $browser->request($r);
#print "\n", "List of all devices:\n";
#print "\n", $response->as_string;
$resp = decode_json $response->content;
#print Dumper($resp);
$count = $resp->{pagination}->{count};
#print "Count = ", $count;
my $i = 0;
for ($j = 0 ; $j <= $#ARGV ; $j++) {
for ($i = 0 ; $i < $count ; $i++) {
if ("$resp->{data}[$i]->{name}" eq "$ARGV[$j]") {
#
# Set "OFF" as 0 and "ON" as 1
#
$state = 2;
$val = uc $ARGV[$j+1];
if ($val eq "OFF") {$state = 0;}
if ($val eq "ON") {$state = 1;}
if ($state == 2) {
print "Must use 'ON' or 'OFF' specifically\n";
exit;
}
$id = $resp->{data}[$i]->{light_bulb_id};
#
# Set the powered state
#
$h = HTTP::Headers->new(
Content_Type => 'application/json',
Authorization => 'Bearer ' . $token
);
$browser = LWP::UserAgent->new();
$URL = $host . '/light_bulbs/' . $id;
%power = ('powered' => $state, 'brightness' => 1);
%data2 = ('desired_state' => \%power);
$json = encode_json \%data2;
$r = HTTP::Request->new('PUT', $URL, $h, $json);
$response = $browser->request($r);
system("/bin/echo -n $ARGV[$j] $ARGV[$j+1] \" : \" >> /usr/local/etc/wink.log");
system("date >> /usr/local/etc/wink.log");
goto next_arg;
} # end "if"
} # end "for $j"
next_arg:
$j++;
} # end "for $i"
exit 0;