Автовключение телевизора
У меня комп подключен к телику, я на нем в гостиной играю в игрушки. И меня в этой схеме парило включать телефизор. Клавиатура для вывода из сна, она большая, и лежит рядом, а пульт постоянно убегает. У консольщиков за это отвечате CEC, но на ПКшные видюхи их не завозят (я считаю это загоовором производителей консолей).
Меня эта проблема парила, и я таки нашел решение, может быть кому-нибудь поможет.
Далее будет контент нейросетей, ибо Кодекс мне проблему и решил.
1. Включаем ADB на телевизоре
На ТВ:
Открываем Настройки.
Идём в О телевизоре / Об устройстве.
Находим Сборка / Build.
Нажимаем на неё 7 раз, пока не появится сообщение “Вы стали разработчиком”.
Возвращаемся назад.
Открываем Для разработчиков.
Включаем:
Отладка по USB;
если есть, Отладка по сети / Network debugging / ADB over network.
Дальше на Windows ставим Android Platform Tools. Например, распаковываем сюда:
C:\platform-tools
(от себя добавлю - наверно можно поставить adb другим способом, но тут я уже не тестил, ибо сработало так)
Проверяем. win+x - Терминал - проверть, что выбран тип "Powershell", будет написно на вкладке
C:\platform-tools\adb.exe connect 192.168.1.12:5555
C:\platform-tools\adb.exe devices -l
На ТВ может появиться запрос “Разрешить отладку?” — разрешаем.
2. Создаём папку
Например: C:\haier-tv-adb-wake
Внутри создаём config.json (создаем текстовый документ, называем его config.json):
{ "tv_device": "192.168.1.12:5555", "adb_path": "C:\\platform-tools\\adb.exe", "delay_before_wake_seconds": 8 }
3. Там же создаём tv_wake.bat (тоже тестовый документ):
@Echo off
setlocal EnableExtensions EnableDelayedExpansion
cd /d "%~dp0"
if not exist "logs" mkdir "logs"
set "TV=192.168.1.12:5555"
set "ADB=adb"
set "DELAY=8"
set "CONNECT_RETRIES=3"
set "LOG=logs\tv_wake.log"
if exist "config.json" (
for /f "usebackq tokens=1,* delims==" %%A in (`powershell -NoProfile -ExecutionPolicy Bypass -Command "$ErrorActionPreference = 'Stop'; $c = Get-Content -Raw -LiteralPath 'config.json' | ConvertFrom-Json; if ($c.tv_device) { 'TV=' + $c.tv_device }; if ($c.adb_path) { 'ADB=' + $c.adb_path }; if ($null -ne $c.delay_before_wake_seconds) { 'DELAY=' + [int]$c.delay_before_wake_seconds }" 2^>nul`) do (
if /i "%%A"=="TV" if not "%%B"=="" set "TV=%%B"
if /i "%%A"=="ADB" if not "%%B"=="" set "ADB=%%B"
if /i "%%A"=="DELAY" if not "%%B"=="" set "DELAY=%%B"
)
)
echo ============================== >> "%LOG%"
echo [%date% %time%] Haier TV wake script started >> "%LOG%"
echo [%date% %time%] TV=%TV% ADB=%ADB% Delay=%DELAY%s >> "%LOG%"
powershell -NoProfile -Command "Start-Sleep -Seconds %DELAY%" >nul 2>&1
set "CONNECTED=0"
for /l %%I in (1,1,%CONNECT_RETRIES%) do (
echo [%date% %time%] Connecting to %TV% attempt %%I/%CONNECT_RETRIES% >> "%LOG%"
"%ADB%" connect "%TV%" >> "%LOG%" 2>&1
echo [%date% %time%] adb connect exit code: !errorlevel! >> "%LOG%"
"%ADB%" devices >> "%LOG%" 2>&1
"%ADB%" devices | findstr /c:"%TV% device" >nul 2>&1
if not errorlevel 1 (
set "CONNECTED=1"
goto :connected
)
powershell -NoProfile -Command "Start-Sleep -Seconds 2" >nul 2>&1
)
:connected
if not "%CONNECTED%"=="1" (
echo [%date% %time%] TV is not connected over ADB, skipping keyevents >> "%LOG%"
echo [%date% %time%] Done >> "%LOG%"
endlocal
exit /b 0
)
echo [%date% %time%] Sending WAKEUP keyevent 224 >> "%LOG%"
"%ADB%" -s "%TV%" shell input keyevent 224 >> "%LOG%" 2>&1
powershell -NoProfile -Command "Start-Sleep -Seconds 1" >nul 2>&1
echo [%date% %time%] Sending INPUT keyevent 178 >> "%LOG%"
"%ADB%" -s "%TV%" shell input keyevent 178 >> "%LOG%" 2>&1
powershell -NoProfile -Command "Start-Sleep -Seconds 1" >nul 2>&1
echo [%date% %time%] Sending OK keyevent 23 >> "%LOG%"
"%ADB%" -s "%TV%" shell input keyevent 23 >> "%LOG%" 2>&1
echo [%date% %time%] Done >> "%LOG%"
endlocal
exit /b 0
Логика такая:
224 = WAKEUP
178 = INPUT
23 = OK
То есть телевизор просыпается, открывает выбор входа и нажимает OK. У меня это возвращает ТВ на нужный HDMI.
4. Прописываем в Планировщик Windows
Создаём install_tasks.ps1 (тоже текстовый документ):
$ErrorActionPreference = 'Stop'
$ProjectDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$BatPath = Join-Path $ProjectDir 'tv_wake.bat'
$CurrentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$Action = New-ScheduledTaskAction -Execute $BatPath -WorkingDirectory $ProjectDir
$Principal = New-ScheduledTaskPrincipal -UserId $CurrentUser -LogonType Interactive -RunLevel Limited
$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -MultipleInstances IgnoreNew
$LogonTrigger = New-ScheduledTaskTrigger -AtLogOn -User $CurrentUser
$ResumeTrigger = Get-CimClass -Namespace root/Microsoft/Windows/TaskScheduler -ClassName MSFT_TaskEventTrigger |
New-CimInstance -ClientOnly
$ResumeTrigger.Enabled = $true
$ResumeTrigger.Subscription = @'
<QueryList>
<Query Id="0" Path="System">
<Select Path="System">
*[System[Provider[@name='Microsoft-Windows-Power-Troubleshooter'] and EventID=1]]
</Select>
</Query>
</QueryList>
'@
Register-ScheduledTask -TaskName 'Haier TV Wake On Logon' -Action $Action -Trigger $LogonTrigger -Principal $Principal -Settings $Settings -Force | Out-Null
Register-ScheduledTask -TaskName 'Haier TV Wake On Resume' -Action $Action -Trigger $ResumeTrigger -Principal $Principal -Settings $Settings -Force | Out-Null
Write-Host 'Installed'
Запускаем из папки проекта:
powershell -ExecutionPolicy Bypass -File .\install_tasks.ps1
Проверить:
Get-ScheduledTask -TaskName "Haier TV Wake On Logon","Haier TV Wake On Resume"
Логи будут тут:
logs\tv_wake.log
Важно: закрепите IP телевизора в роутере, иначе завтра он может стать не 192.168.1.12, и скрипт будет стучаться не туда.
Если телевизор уходит в глубокий сон и ADB по сети отваливается, этот способ его не разбудит. Тогда нужны настройки типа быстрый старт, сетевой режим ожидания, network standby или уже другие методы вроде IR/CEC.
Таким образом, телик будет включаться вместе с компьютером. Автовыключение у меня настроить не удалось (скрипт не успевает отрабатывать, пока комп выключается), так что я это сделал через функцию самого телевизора.
Также добавлю: я совсем не программист, так что любая критика будет уместна. Цель поста - показать, что так можно, а конкретную реализацию каждый теперь с помощью нейронок может сделать сам.






