
Только вот в виду 2011 года выпуска и устаревшего протокола управления по Ethernet подружить мой ТВ с модулем LG SmartTV (v 1.0) by LuckyFIA никак не получилось. Но на выручку пришел порт RS232, также имеющийся в ТВ. С помощью копеечного USB-RS232 адптера все замечательно подключается к серверу, на котором крутится MajorDoMo (в моем случае это Cubietruck с ОС Debian). Полный набор команд управления через последовательный порт можно найти в официальной документации на ТВ.
Немного выдержек из документации на ТВ:
Реализованы функции:
- настройки порта;
- проверки статуса ТВ (включен, выключен, уровень громкости, номер и название канала и пр.);
- включение/выключение ТВ;
- регулировка громкости;
- выбор канала по номеру или по его названию;
- включения/выключение 3D (в том числе его режима - SBS, OU);
- выбор входа ТВ (HDMI, DTV, SATV, CATV и т.д.);
- отправка любой другой команды телевизору согласно его документации и получения статуса выполнения этой команды.
Код: Выделить всё
<link type="text/css" rel="stylesheet" href="../templates/app_lgtvrs232/css/style.css" />
<script language="javascript">
function setChannel(channel) {
var url = '/objects/?object=LG32LW575S&op=m&m=selectTVchannels&channel=';
url += channel;
//alert(url);
AJAXRequest(url, 'updateTVinfo();', '');
};
function setCommand(cmd) {
var url = '/objects/?object=LG32LW575S&op=m&m=controlTV&cmd=';
url += cmd;
//alert(url);
AJAXRequest(url, 'updateTVinfo();', '');
};
function setVolume(vol) {
var url = '/objects/?object=LG32LW575S&op=m&m=controlTV&cmd=setVOL&vol=';
url += vol;
//alert(url);
AJAXRequest(url, '', '');
};
function ajaxGetTVvolume(varname, id, timeout) {
var url="/";
url+='?md=application&action=ajaxgetglobal&var='+encodeURIComponent(varname);
$.ajax({
url: url
}).done(function(data) {
var obj=jQuery.parseJSON(data);
if (obj.DATA) {
$('#'+id).val(obj.DATA);
$('#'+id).slider("refresh");
}
});
if (timeout>0) {
window.setTimeout('ajaxGetTVvolume("'+varname+'", "'+id+'", '+timeout+');', timeout);
}
return false;
}
function updateTVinfo() {
ajaxGetTVvolume('LG32LW575S.volumeLevel', 'tvVOL', 0);
ajaxGetGlobal('LG32LW575S.statusText', 'tvInfo', 0);
//alert('Update OK!');
};
$(document).ready(function() {
// Будем обновлять значения громкости и информации о ТВ каждые 30 сек.
ajaxGetTVvolume('LG32LW575S.volumeLevel', 'tvVOL', 30000);
ajaxGetGlobal('LG32LW575S.statusText', 'tvInfo', 30000);
$(".tvimg").click(function(){
var channel = $(this).attr("channel");
setChannel(channel);
ajaxGetGlobal('LG32LW575S.statusText', 'tvInfo', 0);
});
$(".rcBtn").click(function(){
var cmd = $(this).attr("cmd");
setCommand(cmd);
ajaxGetGlobal('LG32LW575S.statusText', 'tvInfo', 0);
});
$( "#tvVOL" ).slider({
stop: function( event, ui ) {
setVolume($("#tvVOL").val());
}
});
});
</script>
<div style="width: 305px; border-style:solid; border-width:0px; margin: 0 auto;">
<table border="0" aligne="center" style="width: 100%; margin: 0 auto;">
<tr>
<td width="25%" align="center"><span id="vol-result"></span></td>
<td width="25%" align="center"><span id="pwr-result"></span></td>
<td width="25%" align="center"><span id="debugTV"></span></td>
<td width="25%">
<a href="#" cmd="btn_OFF" class="rcBtn ui-btn ui-icon-power ui-btn-icon-notext ui-shadow" style="margin: 0 auto; height: 40px; width: 70px; border-radius: .3125em;"></a>
</td>
</tr>
</table>
<table border="0" aligne="center" style="width: 100%; margin: 0 auto;">
<tr>
<td width="33%" align="center"></td>
<td></td>
<td width="33%">
</td>
</tr>
<tr>
<td colspan="3">
<div style="border-style:solid; border-width:0px; text-align:center; margin: 0 auto;">
<form style="margin-left: 11px;">
<label for="tv_volume" class="ui-hidden-accessible">volume:</label>
<input type="range" name="tv_volume" id="tvVOL" data-highlight="true" min="0" max="50" value="12" />
</form>
</div>
</td>
</tr>
<tr>
<td colspan="3">
<div data-role="controlgroup" data-type="horizontal" data-mini="true" class="ui-nodisc-icon" style="border-style:solid; border-width:0px; text-align:center; margin: 0 auto;">
<a href="#" cmd="btn_chDOWN" class="rcBtn ui-btn ui-icon-carat-d ui-btn-icon-notext ui-shadow"> </a>
<span id="tvInfo" class="ui-btn" style="text-align: center; width:175px"></span>
<a href="#" cmd="btn_chUP" class="rcBtn ui-btn ui-icon-carat-u ui-btn-icon-notext ui-shadow"> </a>
</div>
</td>
</tr>
<tr>
<td width="33%" align="center"> </td>
<td align="center" > </td>
<td width="33%" align="center"> </td>
</tr>
<tr>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Первый HD.png" class="tvimg" channel="Первый HD"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Россия HD.png" class="tvimg" channel="Россия HD"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Первый городской HD.png" class="tvimg" channel="Первый городской HD"></td>
</tr>
<tr>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/СТС.png" class="tvimg" channel="СТС"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/СТС Love.png" class="tvimg" channel="СТС Love"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/ТНТ.png" class="tvimg" channel="ТНТ"></td>
</tr>
<tr>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Disney.png" class="tvimg" channel="Disney"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Перец.png" class="tvimg" channel="Перец"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/ТВ-3.png" class="tvimg" channel="ТВ-3"></td>
</tr>
<tr>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Пятница.png" class="tvimg" channel="Пятница"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Домашний.png" class="tvimg" channel="Домашний"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Discovery Channel.png" class="tvimg" channel="Discovery Channel"></td>
</tr>
<tr>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Animal Planet.png" class="tvimg" channel="Animal Planet"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/TLC.png" class="tvimg" channel="TLC"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/National Geographic.png" class="tvimg" channel="National Geographic"></td>
</tr>
<tr>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/National Geographic HD.png" class="tvimg" channel="National Geographic HD"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Nat Geo Wild HD.png" class="tvimg" channel="Nat Geo Wild HD"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Viasat Explorer.png" class="tvimg" channel="Viasat Explorer"></td>
</tr>
<tr>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Viasat History.png" class="tvimg" channel="Viasat History"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Дом кино.png" class="tvimg" channel="Дом кино"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Viasat TV1000.png" class="tvimg" channel="Viasat TV1000"></td>
</tr>
<tr>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Viasat TV1000 Rus.png" class="tvimg" channel="Viasat TV1000 Rus"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Sony SciFi.png" class="tvimg" channel="Sony SciFi"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Sony Set.png" class="tvimg" channel="Sony Set"></td>
</tr>
<tr>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Fox.png" class="tvimg" channel="Fox"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Fox HD.png" class="tvimg" channel="Fox HD"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Fox Life.png" class="tvimg" channel="Fox Life"></td>
</tr>
<tr>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Fox Life HD.png" class="tvimg" channel="Fox Life HD"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/Paramount Comedy.png" class="tvimg" channel="Paramount Comedy"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/МУЗ ТВ.png" class="tvimg" channel="МУЗ ТВ"></td>
</tr>
<tr>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/MTV.png" class="tvimg" channel="MTV"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/RU TV.png" class="tvimg" channel="RU TV"></td>
<td align="center"><img src="../templates/app_lgtvrs232/images/tvlogo/A-One.png" class="tvimg" channel="A-One"></td>
</tr>
</table>
</div>
Вот небольшой набор примеров, придуманный навскидку:
- Продвинутый будильник. В указанное время включить телевизор и плавно увеличивать громкость.
- Продвинутый напоминальщик. Можно сделать планировщик, который включит телевизор на указанном канале в нужное время.
- Экономайзер электроэнергии. У телевизора есть режим энергосбережения, в котором гасится подсветка ЖК-панели. Снабдить компьютер (или самодельное устройство на каком-нибудь микроконтроллере) датчиком движения — и телевизор можно будет автоматически переводить в режим экономии энергии, когда у телевизора никого нет.
- Эмулятор присутствия. Телевизор может включаться-выключаться автоматически (по расписанию) или удаленно.
- Голосовое управление телевизором.
- Удаленное управление телевизором без пульта ДУ.
- Охранная система (автоматическое переключение источника на видеокамеру при срабатывании датчиков охраны).
- включить медиа-центр XBMC;
- включить ТВ и выбрать вход HDMI, к которому подключен XBMC;
- включить 5.1-акустику и выбрать на ней нужный вход и установить громкость;
- запустить фильм в XBMC;
- если этот фильм в 3D, то на ТВ включить соотвествующий режим (а это еще три нажатия на пульте
);
- при завершении фильма надо опять же этот режим 3Д выключать.
Все используемые файлы, разложенные по нужным каталогам, в архиве:
https://yadi.sk/d/bcLBWrYhh2rms
Экспортированный класс TV с объектом LG32LW575S и методами здесь: С уважением, skysilver.