Управление телевизором на Android TV
И так есть телевизор на Android TV, в мое случае это Xiaomi tv 4s 43.
В качестве операциинной системы сервера умного дома используется Ubuntu x64.
Софт для включения смотри мою предъидущую статью.
И софт управления телевизорм на базе AndroidTV ADB (Android Debug Bridge) (почитать можно тут )
ВНИМАНИЕ (на некоторых системах с процессорами ARM могут быть проблемы с ADB так, как в установчном пакете есть баг разработчика из-за чего не создаются сертефикаты которые необходимы для подключения к телевизору)
ПОЕХАЛИ!
Установим ADB
sudo apt-get update
sudo apt install android-tools-adb
Теперь проверям подключение к телевизору
adb connect IP-телевизора
Если есть коннект супер, если нет ищем в чем проблема.
Теперь займемся настройкой Majordodmo
Благодарю комрада VItt c 4pda.ru давшему мне нужный пинок и срипты для сценариев.
Далее его скрипты и мои наработки.
Скрипт на конект к телику.
ADBconnect
exec('adb connect #ip_addr# 1> /tmp/readings.txt');
exec('sleep 1');
$erroutput = exec('cat /tmp/readings.txt');
var_dump ($erroutput);
Срипт на отправку команд
ADBkeyevent
$keyevent = $params['keyevent'];
$command = 'adb shell input keyevent '.$keyevent.' 2> /var/www/readings.txt';
exec($command);
$erroutput = exec('cat /var/www/readings.txt');
if (strpos($erroutput,'devices/emulators found')<>null)
{
rs('ADBconnect');
exec($command);
}
Вызывется командой
rs ('ADBkeyevent', array('keyevent'=>20));
Списко команд для телевизора
0 --> "KEYCODE_UNKNOWN"
1 --> "KEYCODE_MENU"
2 --> "KEYCODE_SOFT_RIGHT"
3 --> "KEYCODE_HOME"
4 --> "KEYCODE_BACK"
5 --> "KEYCODE_CALL"
6 --> "KEYCODE_ENDCALL"
7 --> "KEYCODE_0"
8 --> "KEYCODE_1"
9 --> "KEYCODE_2"
10 --> "KEYCODE_3"
11 --> "KEYCODE_4"
12 --> "KEYCODE_5"
13 --> "KEYCODE_6"
14 --> "KEYCODE_7"
15 --> "KEYCODE_8"
16 --> "KEYCODE_9"
17 --> "KEYCODE_STAR"
18 --> "KEYCODE_POUND"
19 --> "KEYCODE_DPAD_UP"
20 --> "KEYCODE_DPAD_DOWN"
21 --> "KEYCODE_DPAD_LEFT"
22 --> "KEYCODE_DPAD_RIGHT"
23 --> "KEYCODE_DPAD_CENTER"
24 --> "KEYCODE_VOLUME_UP"
25 --> "KEYCODE_VOLUME_DOWN"
26 --> "KEYCODE_POWER"
27 --> "KEYCODE_CAMERA"
28 --> "KEYCODE_CLEAR"
29 --> "KEYCODE_A"
30 --> "KEYCODE_B"
31 --> "KEYCODE_C"
32 --> "KEYCODE_D"
33 --> "KEYCODE_E"
34 --> "KEYCODE_F"
35 --> "KEYCODE_G"
36 --> "KEYCODE_H"
37 --> "KEYCODE_I"
38 --> "KEYCODE_J"
39 --> "KEYCODE_K"
40 --> "KEYCODE_L"
41 --> "KEYCODE_M"
42 --> "KEYCODE_N"
43 --> "KEYCODE_O"
44 --> "KEYCODE_P"
45 --> "KEYCODE_Q"
46 --> "KEYCODE_R"
47 --> "KEYCODE_S"
48 --> "KEYCODE_T"
49 --> "KEYCODE_U"
50 --> "KEYCODE_V"
51 --> "KEYCODE_W"
52 --> "KEYCODE_X"
53 --> "KEYCODE_Y"
54 --> "KEYCODE_Z"
55 --> "KEYCODE_COMMA"
56 --> "KEYCODE_PERIOD"
57 --> "KEYCODE_ALT_LEFT"
58 --> "KEYCODE_ALT_RIGHT"
59 --> "KEYCODE_SHIFT_LEFT"
60 --> "KEYCODE_SHIFT_RIGHT"
61 --> "KEYCODE_TAB"
62 --> "KEYCODE_SPACE"
63 --> "KEYCODE_SYM"
64 --> "KEYCODE_EXPLORER"
65 --> "KEYCODE_ENVELOPE"
66 --> "KEYCODE_ENTER"
67 --> "KEYCODE_DEL"
68 --> "KEYCODE_GRAVE"
69 --> "KEYCODE_MINUS"
70 --> "KEYCODE_EQUALS"
71 --> "KEYCODE_LEFT_BRACKET"
72 --> "KEYCODE_RIGHT_BRACKET"
73 --> "KEYCODE_BACKSLASH"
74 --> "KEYCODE_SEMICOLON"
75 --> "KEYCODE_APOSTROPHE"
76 --> "KEYCODE_SLASH"
77 --> "KEYCODE_AT"
78 --> "KEYCODE_NUM"
79 --> "KEYCODE_HEADSETHOOK"
80 --> "KEYCODE_FOCUS"
81 --> "KEYCODE_PLUS"
82 --> "KEYCODE_MENU"
83 --> "KEYCODE_NOTIFICATION"
84 --> "KEYCODE_SEARCH"
85 --> "TAG_LAST_KEYCODE"
Сценарий для запуска приложений
ADBapp
$app = $params['app'];
$command = 'adb shell monkey -p '.$app.' -c android.intent.category.LAUNCHER 1 2> /var/www/readings.txt';
exec($command);
$erroutput = exec('cat /var/www/readings.txt');
if (strpos($erroutput,'emulators found')<>null)
{
rs('ADBconnect');
exec($command);
}
Вызывется командой
rs ('ADBapp', array('app'=>'ru.rt.video.app.tv'));
Далее необходимо создать нужные вам классы и объекты в моем случае это
Tv / TVLivingroom
Мой объект input
Мои свойства
Key
oldvalue
TvLive
vol
Volfact
Сценарий для проверки фактического звука
ADBVolfact
if (gg('TVLivingroom.online' )=='1'){
exec('adb shell dumpsys audio 2> /var/www/readings.txt');
$volfact =exec('adb shell dumpsys audio | grep -n Current | sed -n 1p |awk \'{print$5}\' | cat | sed \'s/,$//\'');
setGlobal("input.Volfact",$volfact);
$erroutput = exec('cat /var/www/readings.txt');
if (strpos($erroutput,'devices/emulators found')<>null)
{
rs('ADBconnect');
$volfact = exec(' adb shell dumpsys audio | grep -n Current | sed -n 1p |awk \'{print$5}\' | cat | sed \'s/,$//\'');
setGlobal("input.Volfact",$volfact);
}}
**
Перед создаеним метода необхимо в консоли линукс запустить adb shell dumpsys audio посмотреть после какого слова у вас идет уровень звука и порпавить Current на свое (допустим Current вместо Vol) и посчить на какой позиции само значение и поменять здеся print $5 ( допустим 4 вместо 5)
Сценарий управления уровнем звука
ADBVol
$volparam = $params['volparam'];
$command = 'adb shell service call audio 7 i32 3 i32 '.$volparam.' i32 1> /var/www/readings.txt';
exec($command);
$erroutput = exec('cat /var/www/readings.txt');
if (strpos($erroutput,'devices/emulators found')<>null)
{
rs('ADBconnect');
exec($command);
}
Метод volum связан со свойством volum
$vol = $this->getProperty ('vol');
$volfact = $this->getProperty ('Volfact');
if ($vol !=$volfact) {
rs ('ADBVol', array('volparam'=>$vol ));
setGlobal("input.oldvalue",$vol);} else
{setGlobal("input.oldvalue",$vol);}
Метод volfact связан со свойством volfact
$vol = $this->getProperty ('vol');
$volfact = $this->getProperty ('Volfact');
if ($volfact !=$vol) {setGlobal("input.vol",$volfact);}
Метод key связан со свойством key (переключение каналов)
$key = $this->getProperty ('key');
$s = (string)$key;
$as=$s[0];
$bs=$s[1];
$cs=$s[2];
$str =$key;
$as +=7;
$bs +=7;
$cs +=7;
//$keyeventa = $as;
//$keyeventb = $bs;
//$keyeventc = $cs;
$commanda = 'adb shell input keyevent '.$as.' 2> /var/www/readings.txt';
$commandb = 'adb shell input keyevent '.$bs.' 2> /var/www/readings.txt';
$commandc = 'adb shell input keyevent '.$cs.' 2> /var/www/readings.txt';
$commandrun = 'adb shell input keyevent 4 2> /var/www/readings.txt';
$pr = "".mb_strlen($str,'UTF-8');
if ($pr==1){
exec($commanda);
exec($commandrun);
$erroutput = exec('cat /var/www/readings.txt');
if (strpos($erroutput,'devices/emulators found')<>null)
{
rs('ADBconnect');
exec($commanda);
exec($commandrun);
}} elseif ($pr==2){
exec($commanda);
exec($commandb);
exec($commandrun);
$erroutput = exec('cat /var/www/readings.txt');
if (strpos($erroutput,'devices/emulators found')<>null)
{
rs('ADBconnect');
exec($commanda);
exec($commandb);
exec($commandrun);
}}
else{
exec($commanda);
exec($commandb);
exec($commandc);
exec($commandrun);
$erroutput = exec('cat /var/www/readings.txt');
if (strpos($erroutput,'devices/emulators found')<>null)
{
rs('ADBconnect');
exec($commanda);
exec($commandb);
exec($commandc);
exec($commandrun);
}}
Дальше можно все привязать яндексхоуму и управлять телеком с мобилки лежа в кроватке если пульт далеко))
Дальше только простор для вашей фантазии!
Спасибо камрадам Lorgus и Xor за советы и неоценимую помощь.
Москва, Россия
На форуме: Gastello007