Amazon Dash Buttonで、いつでもテレビ体操第１ができるようにしてみた。おっかぁ、大喜び！？

冬になると寒くて体を動かすのが億劫になりますよね。
わたしのおっかぁ(母)は高齢になり、尚更ずっと家の中に居てばかりで、なかなか体を動かす機会がありません。
主治医からも、体を動かしてしっかり食事を取るよう言われており、その事をおっかぁも気にしている様子。
せめて自宅で軽い体操でもできればと思い、Amazon Dash Button一押しでテレビを見ながら体操できる環境を構築してみました。

流れ
---
さてっと、体操しようかな。
↓
Amazon Dash Buttonを一押しする。
↓
テレビの電源が自動的にONになり、ChromecastのYouTubeでテレビ体操の動画が自動再生される。
↓
動画再生が終わったら自動的に、普段見ているテレビチャンネルに戻して、テレビの電源をOFF(厳密にはSTANDBY)にする。
↓
おつかれさまでした。


配慮すべき点
---
- 思い立ったら、いつでもテレビ体操できるようにしたい。
- おっかぁの操作はAmazon Dash Button一押しのみ。他はすべて自動化する。テレビの自動制御は、HDMI CEC(ON/STANDBY)と赤外線発振器(その他)の組み合わせで実現する。本当はいずれか一方で完結したかったのですが、私にはできませんでした。
- 慌てずに体操を始められるようにする。この点Amazon Dash Buttonの遅延がいい意味で役立つかな。


システム構成
---
![tv-exercise.png](https://qiita-image-store.s3.amazonaws.com/0/63318/1208f0aa-601d-2092-7485-e1d4c13d93bc.png)

便利な仲間たち
---
【ハードウェア】

- Raspberry Pi モデル B+ ... 母艦。おなじみの。お好みの種類で。
- Amazon Dash Button ... お好みのブランドで。
- Google Chromecast 第一世代 ... YouTube再生用に。
- 液晶カラーテレビ SHARP AQUOS LC-32E9 ... 我が家のリビングに鎮座。
- HDMIケーブル ... 液晶カラーテレビとRaspberry Piを接続。HDMI CEC(Consumer Electronics Control)でテレビ制御。
- [GROVE - 赤外線発信器](https://www.switch-science.com/catalog/885/) ... 赤外線でテレビ制御。

【ソフトウェア】

- cec-utils ... HDMI接続でテレビ制御。
- LIRC ... 赤外線でテレビ制御。
- Node.js ... [dash-button - npm](https://www.npmjs.com/package/dash-button) を使うため。
- [dash-button - npm](https://www.npmjs.com/package/dash-button) ... Amazon Dash Button ハック用。
- Supervisor ...  [dash-button - npm](https://www.npmjs.com/package/dash-button)のプロセス管理用。

Raspberry Pi(Raspbian Scratch)のパッケージ更新
---

```shell-session
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
```

HDMI CECでテレビ制御できるようにする
---

HDMI CECとはテレビとかレコーダーとかのHDMI対応機器間での制御信号をやりとりするため規格です。
Raspberry Piからテレビの電源制御をするための設定をします。

1.SHARP AQUOS LC-32E9でファミリンクの設定をする。

　　　リモコン→ファミリンク→ファミリンク制御（連動）→する
　　　　　　　　　 　　　→連動起動設定→する

2.HDMI CECをインストールする。


　　参考：[Qiita - Google Homeに話しかけてテレビの電源を操作してみる](https://qiita.com/miso_develop/items/234f81a7649af08b2861)

```shell-session
$ sudo apt-get install cec-utils
```

3.テレビにRaspberry Piの画面が自動的に切り替わらないようにする。

```shell-session
$ sudo cp -p /boot/config.txt /boot/config.txt.org
$ echo hdmi_ignore_cec_init=1 | sudo tee -a /boot/config.txt
hdmi_ignore_cec_init=1
```

赤外線でテレビ制御できるようにする
---

1.Raspberry Pi モデル B+のGPIO25と、赤外線発信器のTXを接続する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/3cd09581-b8b1-4b9d-aac4-e758b6521b4f.png" width=40%>)



2.LIRCをインストールする。

　参考：[Stacks - Raspberry Pi 3 Model B で赤外線リモコン学習＆操作](http://takuborn.hatenablog.jp/entry/2017/12/05/224039)

```shell-session
$ echo dtoverlay=lirc-rpi,gpio_out_pin=25 | sudo tee -a /boot/config.txt
dtoverlay=lirc-rpi,gpio_out_pin=25
$ sudo apt-get install lirc
$ sudo cp -p /etc/lirc/lirc_options.conf /etc/lirc/lirc_options.conf.org
$ sudo vi /etc/lirc/lirc_options.conf
$ diff /etc/lirc/lirc_options.conf /etc/lirc/lirc_options.conf.org
11,14c11,12
< #driver          = devinput
< #device          = auto
< driver          = default
< device          = /dev/lirc0
---
> driver          = devinput
> device          = auto
$ sudo reboot
```

```shell-session
$ lsmod | grep lirc
lirc_rpi                9032  3
lirc_dev               10583  1 lirc_rpi
rc_core                24377  1 lirc_dev
$ ls  -l /dev/lirc*
crw-rw---- 1 root video 244, 0 12月 21 20:47 /dev/lirc0
$ dmesg | grep lirc
[   33.802341] lirc_dev: IR Remote Control driver registered, major 244
[   33.846060] lirc_rpi: module is from the staging directory, the quality is unknown, you have been warned.
[   34.926612] lirc_rpi: auto-detected active high receiver on GPIO pin 18
[   34.927392] lirc_rpi lirc_rpi: lirc_dev: driver lirc_rpi registered at minor = 0
[   34.927404] lirc_rpi: driver registered!
[   44.084204] input: lircd-uinput as /devices/virtual/input/input0

$ sudo mv /etc/lirc/lircd.conf.d/devinput.lircd.conf /etc/lirc/lircd.conf.d/devinput.lircd.conf.org
```

3.SHARP AQUOSの赤外線リモコン情報を登録する。

[赤外線リモコン関連の補足情報](http://wikiwiki.jp/disklessfun/?remocon_etc)の[SHARP_LCDTV_usingSerialPortReceiver.conf](http://wikiwiki.jp/disklessfun/?plugin=attach&refer=remocon_etc&openfile=SHARP_LCDTV_usingSerialPortReceiver.conf)を /etc/lirc/lircd.conf.d/SHARP_LCDTV.lircd.conf に保存し、lircdを再起動する。

```shell-session
$ sudo vi /etc/lirc/lircd.conf.d/SHARP_LCDTV.lircd.conf
$ sudo systemctl restart lircd
```

4.LIRCの動作確認をする。 

```shell-session
$ irsend LIST "" ""

SHARP_LCDTV
$ irsend LIST SHARP_LCDTV ""

000000000000688b power
000000000000d880 disp
0000000000005888 off_timer
0000000000000c89 dolvy_virtual
000000000000fe48 i_link
0000000000005a46 3digit_input
000000000000f147 preference
000000000000724c 1
000000000000f244 2
0000000000000a43 3
0000000000008a4b 4
0000000000004a47 5
000000000000ca4f 6
0000000000002a41 7
000000000000aa49 8
0000000000006a45 9
000000000000ea4d 10
0000000000001a42 11
0000000000009a4a 12
000000000000714f ground_a
0000000000009141 ground_d
000000000000514d bs
000000000000d145 cs
000000000000d642 data
000000000000e883 mute
000000000000288f vol_up
000000000000a887 vol_down
0000000000008885 prog_up
0000000000004889 prog_down
0000000000007a44 data_interlock
000000000000c881 input_switch
000000000000fa4c prog_info
000000000000064f prog_schedls
000000000000ae4d com_prog_schedls
0000000000002384 menu
000000000000ea81 up
000000000000eb80 left
0000000000001b8f right
0000000000000481 down
0000000000004a8b ok
000000000000af80 ext
0000000000002780 back
0000000000000148 blue
0000000000008140 red
000000000000414c green
000000000000c144 yellow
0000000000003a8c screen_separation
000000000000164e digital_register
000000000000124a ghost_reduction
000000000000e78c av_position
0000000000009040 operation_switch
0000000000006649 picture_switch
000000000000188c sound_switch
000000000000e641 subtitles
0000000000009a86 pause
000000000000ab84 screen_expantion

$ irsend SEND_ONCE SHARP_LCDTV 5
```

コマンド・スクリプト do-tv-exercise.sh でテレビ制御の一連作業をできるようにする
---
参考：[Coderwall - Play YouTube video from terminal to Chromecast](https://coderwall.com/p/jvuzdg/play-youtube-video-from-terminal-to-chromecast)

- Chromecastはテレビの「入力1」に接続されている。
- ChromecastのIPアドレスは192.168.4.100。ルータのDHCPサーバ機能で固定IPアドレスを割り当てるように設定すると便利です。
- YouTubeの[【ふなっしー】ラジオ体操第１【踊ってみた】](https://www.youtube.com/watch?v=oYBQOG9ycrQ) (v=oYBQOG9ycrQ) を再生する。


```shell-session
$ vi do-tv-exercise.sh
```


```shell-session:do-tv-exercise.sh
#!/bin/bash

# HDMI CECでテレビの電源をONにする。
echo "on 0" | cec-client -s -d 1
sleep 7

# 赤外線で「地上デジタル」の信号を送る。
irsend SEND_ONCE SHARP_LCDTV ground_d
sleep 3

# 赤外線で「入力切替」の信号を送る。
irsend SEND_ONCE SHARP_LCDTV input_switch
sleep 3

# もう一度、赤外線で「入力切替」の信号を送る。これで「入力1」に切り替わる。
irsend SEND_ONCE SHARP_LCDTV input_switch
sleep 3

# ChromecastでYouTubeを起動し、指定された動画を再生する。
curl -H "Content-Type: application/json" http://192.168.4.100:8008/apps/YouTube -X POST -d "v=oYBQOG9ycrQ";
sleep 230

# 赤外線でいつも見ている「5チャンネル」の信号を送る。
irsend SEND_ONCE SHARP_LCDTV 5
sleep 3

# HDMI CECでテレビの電源をSTANDBYにする
echo "standby 0" | cec-client -s -d 1
```

```shell-session
$ chmod 755 do-tv-exercise.sh
$ ./do-tv-exercise.sh
```


Node.jsのインストール
---

参考：[Qiita - Ubuntuに最新のNode.jsを難なくインストールする](https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)

```shell-session
$ sudo apt-get install nodejs npm
$ sudo npm cache clean
$ sudo npm install n -g
$ sudo n stable
$ sudo ln -sf /usr/local/bin/node /usr/bin/node
$ node -v
v9.2.1
$ sudo apt-get purge nodejs npm
```

Amazon Dash Buttonを押したら、do-tv-exercise.sh が実行されるようにする
---

参考：[Qiita - Amazon Dash Buttonを(正しくない方向で)使ってみた](http://qiita.com/takustaqu/items/8539b33780c9675c8657)

```shell-session
$ sudo apt-get install git
$ sudo apt-get install libpcap-dev
$ npm init
$ npm install --save dash-button

$ vi adb-tv-exercise.js
```


```js:adb-tv-exercise.js
var DashButton = require("dash-button");

// Amazon Dash ButtonのMACアドレスを設定する。
const PHY_ADDR = "XX:XX:XX:XX:XX:XX";
var button = new DashButton(PHY_ADDR);

button.addListener(() => {
  var exec = require('child_process').exec;
  exec("/home/pi/do-tv-exercise.sh",
  function(error, stdout, stderr) {
    if(stdout) {
      console.log(stdout);
    }
    if(stderr) {
      console.log(stderr);
    }
    if(error !== null) {
      console.log("exec error: " + error);
    }
  });
});
```

プロセス管理ツールsupervisorを使い、adb-tv-exercise.js をデーモン化する
---

```shell-session
$ sudo apt-get install supervisor

$ sudo vi /etc/supervisor/conf.d/adb-tv-exercise.conf
```

```shell-session:/etc/supervisor/conf.d/adb-tv-exercise.conf
[program:adb-tv-exercise]
command=/usr/bin/sudo /usr/bin/node /home/pi/adb-tv-exercise.js
numprocs=1
autostart=true
user=pi
```

```shell-session
$ sudo reboot
```

結果は
---
おっかぁにクリスマス・プレゼントとして、このシステム(Amazon Dash Button)と、もふもふルームソックスをあげました。もふもふルームソックスの方がぬくぬくで喜んでたみたいです。当たり前か。(=^・^=)


謝辞
---
かわいいおばあちゃんのイラスト素材を利用させていただきました。ありがとうございます。
[かわいいフリー素材いらすとや](http://www.irasutoya.com/)