雑食エンジニアの気まぐれレシピ

日ごろ身に着けた技術や見知った知識などの備忘録的なまとめ.主にRaspberry Piやマイコンを使った電子工作について綴っていく予定.機械学習についても書けるといいな.

PCの起動と同時にテレビ(ディスプレイ)を起動させる[レオリモコン]

前回までの記事で書いていたアレクサ連携の話とは直接関係ないのですが,レオリモコンの活用方法の一つということで.

先日,PCのディスプレイ用に43型の4Kテレビを購入しました.ぶっちゃけ大きなディスプレイとか使いこなせる気がしなかったのですが,いざ買ってみるといいものですね.もう手放せないです.
さて,TVをディスプレイ替わりに使用する際のデメリットとして,PCとのHDMI連動起動ができないというものがあります.したがって,PCの起動とは別にTVの電源を入れる必要があります.
面倒なのですが,先人の方々も苦労しているようで明確な解決策は見えてきませんでした.
価格.com - 『PCの電源をいれたら連動してTVもONになるでしょうか?』 シャープ AQUOS LC-22K40-B [22インチ ブラック系] のクチコミ掲示板
とか
え?日記: PCが、HDMIのCECコマンドに対応していない件。
様の記事とか.
ですが,私にはレオリモコンがあります!!
というわけで,レオリモコンを使ってテレビをPCと連動させてみました.

全体の構成

私は普段PCはスリープにさせておく主義で,マウスの拡張ボタンを使ってスリープに移行させています(復帰時は普通にマウスを動かすだけです).
ですので
①テレビの電源を入れ,PCをスリープに移行するスクリプト

②スリープ復帰をトリガーにテレビの電源を入れるスクリプト
を作成します.最初はスリープ移行時をトリガーに①を実行したかったのですが,どーにもうまくいかなかったので実行後にスリープ移行する形としました.
やること自体はかなり単純な話のはずですが,無駄に苦労を重ねたのでその辺もつらつらと書いていきます.

①テレビの電源を入れ,PCをスリープに移行するスクリプト

レオリモコン操作部分についてはtelnet操作できればなんでもいいのでバッチファイルで書こうかと思ったのですが,思ったよりバッチの制約厳しいようなので1,前回のpythonスクリプトを流用することにしました.
次にスリープについてですが,Windowsでのスリープ移行はコマンドで簡単にできるものではないようです.何らかのスクリプトからスリープ用のdllに適切な引数を与えたうえで実行する必要があるそうなのですが,今回は
コマンドラインからWindows PCを停止(スリープなど)する方法 | TipsZone
様の作ってくださったsuspend.exeを使用させていただきました.

②スリープ復帰をトリガーにテレビの電源を入れるスクリプト

スリープの復帰をトリガにするために,まずはスリープ時にどんなイベントが起こっているかを確認します.
win+rのファイル名を指定して実行より"eventvwr"と入力してイベントビューアを起動してログをとってみたところ,私のPCではスリープ時には以下の挙動をしているようです.
f:id:shikky_lab:20180829203334p:plain
一番下の42番がスリープ移行で,107がスリープ復帰となっています.これをタスクスケジューラに次のように入力することで,晴れてスリープ復帰時にスクリプトを起動することができます. f:id:shikky_lab:20180829203804p:plain

しかし何故か失敗する

いまだに原因はよくわかっていないのですが,起動中のpythonスクリプトが途中で終了してしまうという謎の自体が発生しました.ログを確認したところ,途中で成功も失敗もせずに闇に飲まれている模様です.
正直ワケがわからないのですが,さらに分からないことに,pythonコード内でtelnetを開く前に5秒ほどスリープを入れると解決しました.(ちなみに3秒ではだめでした.)

なかなかすっきりしませんが,このスクリプトのおかげでストレスなくTVをディスプレイ替わりとして使えるようになりました.おかげでかなり快適です.
テレビの電源が連動せずに困っている方は,学習リモコンの導入を検討してみるのもありかもしれません.ついでにおうちハックもできますし(笑).


  1. バッチファイル内でtelnetを開くと制御が抜けてしまうため,そのままでは実行できないようです.telnetで送りたい文字列を別ファイルで保存しておき,リダイレクトで取り込むなどの工夫が必要ですが,今回は面倒なので見送りました. 参考:バッチファイルでtelnetを操作したいのですが (DOSプロンプト活用相談室LOG)