Управление телевизорами LG через последовательный порт RS232

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Управление телевизорами LG через последовательный порт R

Сообщение skysilver » Пт мар 11, 2016 1:13 pm

Дмитрий Иванов писал(а):Сейчас ломаю голову, как распарсить шаблон, что бы передать в переменную имя канала. А как сделать тоже самое с именем канала, например СТС?
Вот тут не подскажу. С этим вопросом лучше в ветку по шаблонам поведения.
У меня заведено несколько шаблонов на конкретные каналы, но пользуюсь ими крайне редко - обычно только для демонстрации гостям голосового управления. :)

По вопросу включения канала по его номеру - есть варианты. В классе lgtv_rs232.class реализованы такие функции, как:
  • getChannelNumberByName($chName) (Принимает название ТВ-канала. Возвращает номер ТВ-канала, если команда успешно выполнена, иначе FALSE).
  • getChannelNameByNumber($channelNumber) (Принимает номер ТВ-канала. Возвращает название ТВ-канала, если команда успешно выполнена, иначе FALSE).
Соответственно можно написать метод, который будет переключать канал не по его названию, а по номеру.

Также в классе есть базовая функция command($command, $data), которая в качестве параметра $command может принимать значение 'channel select'. И если в $data подсунуть номер канала в hex-формате и тип вещания, то можно переключать каналы и таким способом, причем не только на цифровом кабельном вещании, а на любом.
За это сообщение автора skysilver поблагодарил:
Дмитрий Иванов (Пт мар 11, 2016 2:25 pm)
Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Дмитрий Иванов
Сообщения: 83
Зарегистрирован: Вс фев 28, 2016 11:36 pm
Благодарил (а): 17 раз
Поблагодарили: 25 раз

Re: Управление телевизорами LG через последовательный порт R

Сообщение Дмитрий Иванов » Пт мар 11, 2016 2:27 pm

Все догнал сам:

Вклю(чи|чить) телевизор на (\w+)

$сh=$matches[2];
say("$сh");

Теперь застрял, как распарсить 2 слова, типа "Рен ТВ" ?... Может, кто подскажет?
Спасибо!
Аватара пользователя
slgeo
Сообщения: 551
Зарегистрирован: Чт фев 05, 2015 2:35 pm
Откуда: РнД
Благодарил (а): 139 раз
Поблагодарили: 74 раза

Re: Управление телевизорами LG через последовательный порт R

Сообщение slgeo » Пт мар 11, 2016 3:12 pm

а зачем их парсить дополнительно? $matches[3] соответственно )
За это сообщение автора slgeo поблагодарил:
Дмитрий Иванов (Пт мар 11, 2016 4:20 pm)
Рейтинг: 1.16%
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
Дмитрий Иванов
Сообщения: 83
Зарегистрирован: Вс фев 28, 2016 11:36 pm
Благодарил (а): 17 раз
Поблагодарили: 25 раз

Re: Управление телевизорами LG через последовательный порт R

Сообщение Дмитрий Иванов » Пт мар 11, 2016 4:41 pm

slgeo, спасибо!
Пока получается или для 2-х слов маску сделать (но не работает с одним):

фраза: "Включи телевизор на Рен ТВ"
шаблон: Вклю(чи|чить) телевизор на (\w+)(\s+)(\w*)
разбор: $ch=("$matches[2] $matches[4]");

или для одного:
фраза: "Включи телевизор на СТС"
шаблон: Вклю(чи|чить) телевизор на (\w+)
разбор: $ch=("$matches[2] $matches[4]");

пытался прикручивать в маску "|" (альтернативу) совсем запутался...
Дмитрий Иванов
Сообщения: 83
Зарегистрирован: Вс фев 28, 2016 11:36 pm
Благодарил (а): 17 раз
Поблагодарили: 25 раз

Re: Управление телевизорами LG через последовательный порт R

Сообщение Дмитрий Иванов » Вс мар 13, 2016 9:42 pm

Подвожу промежуточный итог своих экспериментов - не работает. Видимо причина в моем тв LG LH-5000..., Часть функций работает, а вот с переключением каналов - ни как... callMethod('LG32LW575S.selectTVchannels', array('channel'=>'СТС')); на реальной системе не срабатывает. Гадаю с чем это связано: или с самим методом, который, я так понял, как-то получает от телевизора имена цифровых каналов (а моя модель так, видимо, не умеет) или вся проблема, что на Малине не получается нормально запустить lgtv_rs232.class (с подключенным классом php_serial).
Решил я для начала разобраться с проблемой ошибки декларирования класса в строке require('php_serial.class.php'); Для этого на виртуалке поставил последнюю версию Debian, все необходимые компоненты, запустил MajorDoMo, скопировал все файлы (lgtv_rs232.class, php_serial.class.php, шаблоны) и получил ровно туже ошибку в логах апача (Fatal error: Cannot redeclare class phpSerial in /var/www/lib/php_serial.class.php on line 18). Я даже для чистоты эксперимента весь файл lgtv_rs232.class вычистил, оставив только декларирование класса serial - результат такой же. А как только комментирую эту строку - ошибки нет. Система Debian, поставленная с нуля. Повторяемость ошибки 100%. Помогите разобраться - куда копать?!
Спасибо!
Аватара пользователя
slgeo
Сообщения: 551
Зарегистрирован: Чт фев 05, 2015 2:35 pm
Откуда: РнД
Благодарил (а): 139 раз
Поблагодарили: 74 раза

Re: Управление телевизорами LG через последовательный порт R

Сообщение slgeo » Пн мар 14, 2016 9:48 am

Посмотри у меня в Connect-е шаблон "канал (.+)". Код простейший, работает на 1,2 и более слов. Правда заточено под спутн. ресивер, но суть одна и та же.
За это сообщение автора slgeo поблагодарил:
Дмитрий Иванов (Вт мар 15, 2016 12:24 am)
Рейтинг: 1.16%
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Управление телевизорами LG через последовательный порт R

Сообщение skysilver » Пн мар 14, 2016 11:38 am

Дмитрий Иванов писал(а):Гадаю с чем это связано: или с самим методом, который, я так понял, как-то получает от телевизора имена цифровых каналов (а моя модель так, видимо, не умеет)
Вот такого точно нет. Соответствие имени канала его номеру прописывается в файле channels.csv, который должен лежать в /var/www/templates/app_lgtvrs232. Выглядит так:
СпойлерПоказать

Код: Выделить всё

1,Первый,
2,Россия 1,
3,Россия 2,
4,НТВ,
5,Спб 5 Канал,
6,Россия К,
7,Россия 24,
8,Карусель,
9,ОТР,
10,ТВ Центр,
11,ТНТ,
12,Shopping live,
13,СТС,
14,Рен ТВ,
15,МТС-ИНФО,
16,Первый городской HD,
17,Disney,
18,Перец,
19,ТВ-3,
20,Ю ТВ,
При вызове метода callMethod('LG32LW575S.selectTVchannels', array('channel'=>'СТС')); будет произведен поиск канала СТС по его имени в файлике channels.csv, и ТВ переключится на 13-ый канал. Разумеется, нужно в методе писать имя канала на той же раскладке, что в channels.csv. А командами в консоли линукса (например, через minicom) у вас каналы переключаются?
Дмитрий Иванов писал(а):Решил я для начала разобраться с проблемой ошибки декларирования класса в строке require('php_serial.class.php'); Для этого на виртуалке поставил последнюю версию Debian, все необходимые компоненты, запустил MajorDoMo, скопировал все файлы (lgtv_rs232.class, php_serial.class.php, шаблоны) и получил ровно туже ошибку в логах апача (Fatal error: Cannot redeclare class phpSerial in /var/www/lib/php_serial.class.php on line 18). Я даже для чистоты эксперимента весь файл lgtv_rs232.class вычистил, оставив только декларирование класса serial - результат такой же. А как только комментирую эту строку - ошибки нет.
Видимо, где-то уже подсасывается php_serial.class.php. Попробуйте поиском пройтись по всему каталогу /var/www и найти все вхождения php_serial.
Другой вариант - в файле lgtv_rs232.class.php заменить строку

Код: Выделить всё

require('php_serial.class.php'); 
на

Код: Выделить всё

require_once('php_serial.class.php'); 
За это сообщение автора skysilver поблагодарил:
Дмитрий Иванов (Вт мар 15, 2016 12:17 am)
Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Дмитрий Иванов
Сообщения: 83
Зарегистрирован: Вс фев 28, 2016 11:36 pm
Благодарил (а): 17 раз
Поблагодарили: 25 раз

Re: Управление телевизорами LG через последовательный порт R

Сообщение Дмитрий Иванов » Вт мар 15, 2016 12:15 am

skysilver Спасибо!
Ура, с большего разобрался!
require_once('php_serial.class.php'); - помогло - апач больше не ругается... других вхождений (искал текстовым поиском) не обнаружено.
Углубленно вник в инструкцию, вот выдержка.
СпойлерПоказать
TV.jpg
TV.jpg (77.2 КБ) 7428 просмотров
таким образом, для включения 17 канала, нужно дать команду:

Код: Выделить всё

ma 01 00 11 10
- последнее число идентификатор диапазона (10 DTV). Поэтому в классе lgtv_rs232 изменил одну строку:

Код: Выделить всё

$this->data = substr($chHex, 0, 2) . ' ' . substr($chHex, 2, 3) . ' 90';
строкой:

Код: Выделить всё

$this->data = substr($chHex, 0, 2) . ' ' . substr($chHex, 2, 3) . ' 10';
последняя цифра указатель диапазона...
Осталось все причесать и настроить нормальное распознавание.
Последний раз редактировалось Дмитрий Иванов Вт мар 15, 2016 12:24 am, всего редактировалось 1 раз.
Дмитрий Иванов
Сообщения: 83
Зарегистрирован: Вс фев 28, 2016 11:36 pm
Благодарил (а): 17 раз
Поблагодарили: 25 раз

Re: Управление телевизорами LG через последовательный порт R

Сообщение Дмитрий Иванов » Вт мар 15, 2016 12:23 am

slgeo
Спасибо, маска "(.+)" подошла! Вроде корректно и с одним и двумя словами работает!
Albert
Сообщения: 57
Зарегистрирован: Чт янв 26, 2017 7:08 pm
Благодарил (а): 40 раз
Поблагодарили: 4 раза

Re: Управление телевизорами LG через последовательный порт R

Сообщение Albert » Вт июл 18, 2017 4:35 pm

skysilver писал(а): ... В меню MajorDoMo добавил пункт и элементы контроля телевизором. Получилось вот так (интерфейс ПДУ позаимствовал у LuckyFIA): Основное меню.jpg, Управление каналами.jpg, Пульт ДУ.jpg
Код меню следующий:
...<link type="text/css" rel="stylesheet" href="../templates/app_lgtvrs232/css/style.css" />...
все импортировал, модуль LG Smart TV установлен, сопряженного устройства естественно нет, templates/app_smarttv/images/ присутствует, в итоге Управление каналами.jpg присутствует, а вот пульта ДУ нет. В чем может быть проблема? Или нужен дополнительный код меню для пульта? Можно его выложить сюда тоже?
Ответить