Powershell. Управление телевизором Sony Bravia KDL-42W705B
23 Jul 2016
local_offer
powershell
Как-то раз задумался и решил, что мой "Умный дом" должен уметь управлять телевизором. Нашел в сети bash скрипты для упрпавления телевизором Sony, но так-как мой сервер OpenHAB крутится на Windows машине пришлось это дело переписать на powershell.
Скрипт регистрации устройства управления (наш компьютер) на телевизоре:
<#
SonyTVRemote
Version 0.9
Description: Скрипт auth на powershell - регистрация на телевизоре Sony
GitHub: https://github.com/plsatin/SonyTVRemote
Pavel Satin (c) 2016
pslater.ru@gmail.com
#>
$returnStateOK = 0
$returnStateWarning = 1
$returnStateCritical = 2
$returnStateUnknown = 3
#Проверяем существует ли файл с ip адресом телевизора и читаем его
if ( Test-Path "tvip.cfg" ) {
$tv_ip = Get-Content "tvip.cfg"
} else {
$returnState = $returnStateCritical
# [System.Environment]::Exit($returnState)
Write-Host $returnState
Break
}
#Задаем названия и guid нащего устройства управления
$my_device = "openhab"
$my_nick = "HomeControl"
$my_uuid = [guid]::NewGuid()
#Проверяем были ли уже получены куки и если да завершаем работу
if ( Test-Path "auth_cookie" ) {
$returnState = $returnStateWarning
Write-Host "Файл auth_cookie уже существует, сначала удалите его."
# [System.Environment]::Exit($returnState)
Write-Host $returnState
Break
}
#Проверяем все параметры
if ( $tv_ip -eq "" -Or $my_nick -eq "" -Or $my_device -eq "" ) {
$returnState = $returnStateWarning
Write-Host "Отсутсвуют параметры для продолжения работы."
# [System.Environment]::Exit($returnState)
Write-Host $returnState
Break
}
#Формируем JSON запрос для регистрации устройства управления
$data = @"
{
"method" : "actRegister",
"params" : [{
"clientid" : "${my_nick}:${my_uuid}",
"nickname" : "${my_nick} ( ${my_device} )",
"level" : "private"
},[
{
"value" : "yes",
"function" :"WOL"
}]],
"id" : 8,
"version" : "1.0"
}
"@
$url = "http://${tv_ip}/sony/accessControl"
#Отправляем запрос на регистрацию
Invoke-WebRequest -Method Post -Uri $url -Body $data
#Запрашиваем ПИН код отобразившийся на телевизоре у пользователя
$tv_challenge = Read-Host "Enter PIN code"
#Формируем заголовок с ПИН кодом в base64
$encodedpin = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(":${tv_challenge}"))
$basicAuthValue = "Basic $encodedpin"
$Headers = @{
Authorization = $basicAuthValue
}
#Формируем JSON запрос с отправкой ПИН кода
$data2 = @"
{
"method" : "actRegister",
"params" : [{
"clientid" : "${my_nick}:${my_uuid}",
"nickname" : "${my_nick} ( ${my_device} )"
},[
{
"clientid" : "${my_nick}:${my_uuid}",
"nickname" : "${my_nick} ( ${my_device} )",
"value" : "yes",
"function" :"WOL"
}]],
"id" : 8,
"version" : "1.0"
}
"@
#Отправляем запрос с ПИН кодом
$Request = Invoke-WebRequest -Method Post -Headers $Headers -Uri $url -Body $data2
#Забираем куки из ответа и записываем в файл
$cookie = $Request.Headers["Set-Cookie"].Split(";")[0]
$cookie | Out-File "auth_cookie"
Для примера скрипт включения/выключения звука на телевизоре:
<#
SonyTVRemote
Version 0.9
Description: Скрипт выключени/включения звука (mute) на телевизоре Sony
GitHub: https://github.com/plsatin/SonyTVRemote
Pavel Satin (c) 2016
pslater.ru@gmail.com
#>
$returnStateOK = 0
$returnStateWarning = 1
$returnStateCritical = 2
$returnStateUnknown = 3
if ( Test-Path "tvip.cfg" ) {
$tv_ip = Get-Content "tvip.cfg"
} else {
$returnState = $returnStateCritical
# [System.Environment]::Exit($returnState)
Write-Host $returnState
Break
}
if ( Test-Path "auth_cookie" ) {
} else {
$returnState = $returnStateWarning
Write-Host "Файл с куками не найден! Работа скрипта завершена."
# [System.Environment]::Exit($returnState)
Write-Host $returnState
Break
}
$url = "http://${tv_ip}/sony/audio"
#$status = "true"
$status = $args[0]
$cookie_auth = Get-Content "auth_cookie"
$data = @"
{
"id" : 10,
"version" : "1.0",
"method" : "setAudioMute",
"params" : [{
"status" : ${status}
}]
}
"@
#Готовим куки
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$cookie = New-Object System.Net.Cookie
$cookie.Name = "auth"
$cookie.Value = $cookie_auth.Split("=")[1]
$cookie.Domain = $tv_ip
$session.Cookies.Add($cookie);
$Request = Invoke-WebRequest -Method Post -Uri $url -Body $data -WebSession $session