Created
January 11, 2015 19:14
-
-
Save hollie/ed1fa39871e93e36e24e to your computer and use it in GitHub Desktop.
MisterHouse control for a Samsung Smart TV (by Brian Klier via the mailling list)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
###################################################### | |
# Klier Home Automation - Samsung TV Control Module # | |
# Version 1.00 # | |
# By: Brian Klier # | |
# January 11, 2015 # | |
# E-Mail: brian@kliernetwork.net # | |
# Webpage: http://kliernetwork.net # | |
###################################################### | |
# | |
# Based on a post on the SamyGO forum from "pjnewman" on May 10, 2011 | |
# http://forum.samygo.tv/viewtopic.php?f=12&t=1792 | |
# | |
# New in Version 1.00: | |
# - Initial Release | |
# | |
use MIME::Base64; | |
# Category=TV | |
$samsung_tv = new Socket_Item ('asdf', 'login', '192.168.2.155:55000', undef, 'tcp', 'raw' ); | |
set_casesensitive $samsung_tv; | |
my $myip = "192.168.2.2"; # Doesn't seem to be really used | |
my $mymac = "00-08-02-07-02-7d"; # Used for initial access control/validation | |
my $appstring = "iphone..iapp.samsung"; # What the iPhone app reports | |
my $tvappstring = "iphone.UE32C6500.iapp.samsung"; # Might need changing to match your TV type | |
my $remotename = "Perl Samsung Remote"; # What gets reported when it asks for permission/also shows in General->Wireless Remote Control menu | |
my ($send_samsung_codes, @samsung_codes_to_send, $samsunglist); | |
$v_samsung_off = new Voice_Cmd("Shut off TV"); | |
if ($state = said $v_samsung_off) { | |
$send_samsung_codes = "POWEROFF"; | |
} | |
$v_samsung_ch4 = new Voice_Cmd("Turn TV to Channel 4"); | |
if ($state = said $v_samsung_ch4) { | |
$send_samsung_codes = "4,ENTER"; | |
} | |
$v_samsung_ch52 = new Voice_Cmd("Turn TV to Channel 5.2"); | |
if ($state = said $v_samsung_ch52) { | |
$send_samsung_codes = "5,PLUS100,2,ENTER"; | |
} | |
$v_samsung_ch5times = new Voice_Cmd("Turn Channel Up 5 Times"); | |
if ($state = said $v_samsung_ch5times) { | |
$send_samsung_codes = "CHUP,CHUP,CHUP,CHUP,CHUP"; | |
} | |
$v_samsung_ch5dwntimes = new Voice_Cmd("Turn Channel Down 5 Times"); | |
if ($state = said $v_samsung_ch5dwntimes) { | |
$send_samsung_codes = "CHDOWN,CHDOWN,CHDOWN,CHDOWN,CHDOWN"; | |
} | |
$v_samsung_key = new Voice_Cmd("Send | |
[POWEROFF,SOURCE,0,1,2,3,4,5,6,7,8,9,PLUS100,TTX_MIX,PRECH,MENU,GUIDE,CONTENTS,TOOLS,INFO,EXIT,CHUP,CHDOWN,CH_LIST,VOLUP,VOLDOWN,MUTE,UP,LEFT,RIGHT,DOWN,ENTER,RED,GREEN,Y | |
ELLOW,CYAN,W_LINK,RSS,MTS,AD,PICTURE_SIZE,CAPTION,REWIND,PAUSE,FF,REC,PLAY,STOP,TV] to Samsung TV"); | |
if ($state = said $v_samsung_key) { | |
$samsung_tv->start; | |
my $messagepart1 = chr(0x64) . chr(0x00) . chr(length(encode_base64($myip, ""))) . chr(0x00) . encode_base64($myip, "") . chr(length(encode_base64($mymac, ""))) . | |
chr(0x00) . encode_base64($mymac, "") . chr(length(encode_base64($remotename, ""))) . chr(0x00) . encode_base64($remotename, ""); | |
my $part1 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart1)) . chr(0x00) . $messagepart1; | |
set $samsung_tv $part1; | |
my $messagepart2 = chr(0xc8) . chr(0x00); | |
my $part2 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart2)) . chr(0x00) . $messagepart2; | |
set $samsung_tv $part2; | |
my $key = "KEY_" . state $v_samsung_key; | |
my $messagepart3 = chr(0x00) . chr(0x00) . chr(0x00) . chr(length(encode_base64($key, ""))) . chr(0x00) . encode_base64($key, ""); | |
my $part3 = chr(0x00) . chr(length($tvappstring)) . chr(0x00) . $tvappstring . chr(length($messagepart3)) . chr(0x00) . $messagepart3; | |
set $samsung_tv $part3; | |
$samsung_tv->stop; | |
} | |
# When send_samsung_codes variable changes, send the codes to the TV and clear the variable. | |
# Codes to be sent sequentially should be separated by commas. | |
if ($send_samsung_codes ne '') { | |
print_log "Sending $send_samsung_codes to Samsung TV..."; | |
$samsung_tv->start; | |
my $messagepart1 = chr(0x64) . chr(0x00) . chr(length(encode_base64($myip, ""))) . chr(0x00) . encode_base64($myip, "") . chr(length(encode_base64($mymac, ""))) . | |
chr(0x00) . encode_base64($mymac, "") . chr(length(encode_base64($remotename, ""))) . chr(0x00) . encode_base64($remotename, ""); | |
my $part1 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart1)) . chr(0x00) . $messagepart1; | |
set $samsung_tv $part1; | |
my $messagepart2 = chr(0xc8) . chr(0x00); | |
my $part2 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart2)) . chr(0x00) . $messagepart2; | |
set $samsung_tv $part2; | |
@samsung_codes_to_send = (split(',', $send_samsung_codes)); | |
foreach $samsunglist (@samsung_codes_to_send) { | |
my $key = "KEY_" . $samsunglist; | |
my $messagepart3 = chr(0x00) . chr(0x00) . chr(0x00) . chr(length(encode_base64($key, ""))) . chr(0x00) . encode_base64($key, ""); | |
my $part3 = chr(0x00) . chr(length($tvappstring)) . chr(0x00) . $tvappstring . chr(length($messagepart3)) . chr(0x00) . $messagepart3; | |
set $samsung_tv $part3; | |
select(undef, undef, undef, 0.25); | |
#sleep 1; | |
} | |
$samsung_tv->stop; | |
$send_samsung_codes = ''; | |
} | |
=for | |
******************************************************* | |
* This is a full list of keys available to TVs * | |
******************************************************* | |
KEY_MENU | |
KEY_UP | |
KEY_DOWN | |
KEY_LEFT | |
KEY_RIGHT | |
KEY_3 | |
KEY_VOLUP | |
KEY_4 | |
KEY_5 | |
KEY_6 | |
KEY_VOLDOWN | |
KEY_7 | |
KEY_8 | |
KEY_9 | |
KEY_MUTE | |
KEY_CHDOWN | |
KEY_0 | |
KEY_CHUP | |
KEY_PRECH | |
KEY_GREEN | |
KEY_YELLOW | |
KEY_CYAN | |
KEY_ADDDEL | |
KEY_SOURCE | |
KEY_INFO | |
KEY_PIP_ONOFF | |
KEY_PIP_SWAP | |
KEY_PLUS100 | |
KEY_CAPTION | |
KEY_PMODE | |
KEY_TTX_MIX | |
KEY_TV | |
KEY_PICTURE_SIZE | |
KEY_AD | |
KEY_PIP_SIZE | |
KEY_MAGIC_CHANNEL | |
KEY_PIP_SCAN | |
KEY_PIP_CHUP | |
KEY_PIP_CHDOWN | |
KEY_DEVICE_CONNECT | |
KEY_HELP | |
KEY_ANTENA | |
KEY_CONVERGENCE | |
KEY_11 | |
KEY_12 | |
KEY_AUTO_PROGRAM | |
KEY_FACTORY | |
KEY_3SPEED | |
KEY_RSURF | |
KEY_ASPECT | |
KEY_TOPMENU | |
KEY_GAME | |
KEY_QUICK_REPLAY | |
KEY_STILL_PICTURE | |
KEY_DTV | |
KEY_FAVCH | |
KEY_REWIND | |
KEY_STOP | |
KEY_PLAY | |
KEY_FF | |
KEY_REC | |
KEY_PAUSE | |
KEY_TOOLS | |
KEY_INSTANT_REPLAY | |
KEY_LINK | |
KEY_FF_ | |
KEY_GUIDE | |
KEY_REWIND_ | |
KEY_ANGLE | |
KEY_RESERVED1 | |
KEY_ZOOM1 | |
KEY_PROGRAM | |
KEY_BOOKMARK | |
KEY_DISC_MENU | |
KEY_PRINT | |
KEY_RETURN | |
KEY_SUB_TITLE | |
KEY_CLEAR | |
KEY_VCHIP | |
KEY_REPEAT | |
KEY_DOOR | |
KEY_OPEN | |
KEY_WHEEL_LEFT | |
KEY_POWER | |
KEY_SLEEP | |
KEY_2 | |
KEY_DMA | |
KEY_TURBO | |
KEY_1 | |
KEY_FM_RADIO | |
KEY_DVR_MENU | |
KEY_MTS | |
KEY_PCMODE | |
KEY_TTX_SUBFACE | |
KEY_CH_LIST | |
KEY_RED | |
KEY_DNIe | |
KEY_SRS | |
KEY_CONVERT_AUDIO_MAINSUB | |
KEY_MDC | |
KEY_SEFFECT | |
KEY_DVR | |
KEY_DTV_SIGNAL | |
KEY_LIVE | |
KEY_PERPECT_FOCUS | |
KEY_HOME | |
KEY_ESAVING | |
KEY_WHEEL_RIGHT | |
KEY_CONTENTS | |
KEY_VCR_MODE | |
KEY_CATV_MODE | |
KEY_DSS_MODE | |
KEY_TV_MODE | |
KEY_DVD_MODE | |
KEY_STB_MODE | |
KEY_CALLER_ID | |
KEY_SCALE | |
KEY_ZOOM_MOVE | |
KEY_CLOCK_DISPLAY | |
KEY_AV1 | |
KEY_SVIDEO1 | |
KEY_COMPONENT1 | |
KEY_SETUP_CLOCK_TIMER | |
KEY_COMPONENT2 | |
KEY_MAGIC_BRIGHT | |
KEY_DVI | |
KEY_HDMI | |
KEY_W_LINK | |
KEY_DTV_LINK | |
KEY_APP_LIST | |
KEY_BACK_MHP | |
KEY_ALT_MHP | |
KEY_DNSe | |
KEY_RSS | |
KEY_ENTERTAINMENT | |
KEY_ID_INPUT | |
KEY_ID_SETUP | |
KEY_ANYNET | |
KEY_POWEROFF | |
KEY_POWERON | |
KEY_ANYVIEW | |
KEY_MS | |
KEY_MORE | |
KEY_PANNEL_POWER | |
KEY_PANNEL_CHUP | |
KEY_PANNEL_CHDOWN | |
KEY_PANNEL_VOLUP | |
KEY_PANNEL_VOLDOW | |
KEY_PANNEL_ENTER | |
KEY_PANNEL_MENU | |
KEY_PANNEL_SOURCE | |
KEY_AV2 | |
KEY_AV3 | |
KEY_SVIDEO2 | |
KEY_SVIDEO3 | |
KEY_ZOOM2 | |
KEY_PANORAMA | |
KEY_4_3 | |
KEY_16_9 | |
KEY_DYNAMIC | |
KEY_STANDARD | |
KEY_MOVIE1 | |
KEY_CUSTOM | |
KEY_AUTO_ARC_RESET | |
KEY_AUTO_ARC_LNA_ON | |
KEY_AUTO_ARC_LNA_OFF | |
KEY_AUTO_ARC_ANYNET_MODE_OK | |
KEY_AUTO_ARC_ANYNET_AUTO_START | |
KEY_AUTO_FORMAT | |
KEY_DNET | |
KEY_HDMI1 | |
KEY_AUTO_ARC_CAPTION_ON | |
KEY_AUTO_ARC_CAPTION_OFF | |
KEY_AUTO_ARC_PIP_DOUBLE | |
KEY_AUTO_ARC_PIP_LARGE | |
KEY_AUTO_ARC_PIP_SMALL | |
KEY_AUTO_ARC_PIP_WIDE | |
KEY_AUTO_ARC_PIP_LEFT_TOP | |
KEY_AUTO_ARC_PIP_RIGHT_TOP | |
KEY_AUTO_ARC_PIP_LEFT_BOTTOM | |
KEY_AUTO_ARC_PIP_RIGHT_BOTTOM | |
KEY_AUTO_ARC_PIP_CH_CHANGE | |
KEY_AUTO_ARC_AUTOCOLOR_SUCCESS | |
KEY_AUTO_ARC_AUTOCOLOR_FAIL | |
KEY_AUTO_ARC_C_FORCE_AGING | |
KEY_AUTO_ARC_USBJACK_INSPECT | |
KEY_AUTO_ARC_JACK_IDENT | |
KEY_NINE_SEPERATE | |
KEY_ZOOM_IN | |
KEY_ZOOM_OUT | |
KEY_MIC | |
KEY_HDMI2 | |
KEY_HDMI3 | |
KEY_AUTO_ARC_CAPTION_KOR | |
KEY_AUTO_ARC_CAPTION_ENG | |
KEY_AUTO_ARC_PIP_SOURCE_CHANGE | |
KEY_HDMI4 | |
KEY_AUTO_ARC_ANTENNA_AIR | |
KEY_AUTO_ARC_ANTENNA_CABLE | |
KEY_AUTO_ARC_ANTENNA_SATELLITE | |
KEY_EXT1 | |
KEY_EXT2 | |
KEY_EXT3 | |
KEY_EXT4 | |
KEY_EXT5 | |
KEY_EXT6 | |
KEY_EXT7 | |
KEY_EXT8 | |
KEY_EXT9 | |
KEY_EXT10 | |
KEY_EXT11 | |
KEY_EXT12 | |
KEY_EXT13 | |
KEY_EXT14 | |
KEY_EXT15 | |
KEY_EXT16 | |
KEY_EXT17 | |
KEY_EXT18 | |
KEY_EXT19 | |
KEY_EXT20 | |
KEY_EXT21 | |
KEY_EXT22 | |
KEY_EXT23 | |
KEY_EXT24 | |
KEY_EXT25 | |
KEY_EXT26 | |
KEY_EXT27 | |
KEY_EXT28 | |
KEY_EXT29 | |
KEY_EXT30 | |
KEY_EXT31 | |
KEY_EXT32 | |
KEY_EXT33 | |
KEY_EXT34 | |
KEY_EXT35 | |
KEY_EXT36 | |
KEY_EXT37 | |
KEY_EXT38 | |
KEY_EXT39 | |
KEY_EXT40 | |
KEY_EXT41 | |
=cut |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment