自動でZIP!deポン!

この記事は Altplus Advent Calendar 2017 (https://qiita.com/advent-calendar/2017/altplus) の12日目のエントリです。

寒さも厳しくなってきた今日この頃ですがみなさまいかがお過ごしでしょうか。

さて今日はポンポンポポポン！という掛け声と共に始まるZIP!deポン!というゲームを自動化する話を書こうと思います。

## ZIP!deポン!とは？

ZIP!deポン!というゲームは、日テレで放送中の朝の情報番組「ZIP!」の中の視聴者参加型コーナーのことです。

このコーナーは一日の放送中に「6:20頃」「6:50頃」「7:50頃」の3回実施されます。

各回でクイズが出題され、当たれば3ポイント、外れても1ポイントもらえます。

20ポイントが貯まるとGoogleHomeやオーブンレンジ、カニといった魅力的な商品のプレゼントに応募することができます。

また、各ポイントの集計期間は2週間毎になりますので、10営業日 x 3ゲーム = 30回のポイント取得チャンスがあります。


## なぜ自動化するのか？

私の務めている会社は10時始業のため、それに合わせて朝も比較的ゆっくり起きることになります。
そうすると必然的に6時台はまだ夢の中にいるため、7:50頃のゲームにしか参加できず、なかなかポイントが貯まらないため応募するのが難しい状態となります。

具体的には毎日7:50だけ参加したとしてもギリギリ20ポイント行くかいかないか、という感じです。

6時台に行われている2回のゲームを実行することができれば全て外れたとしても確実に30ポイントとれますので応募出来ます。

## どうやるのか？

株式会社グラモ から販売されている [iRemocon](http://i-remocon.com/) という製品を利用します。
iRemoconは簡単に言えばスマホから操作可能な高機能学習リモコンです。
家の中(同一ネットワーク)はもちろん、外出先からも操作できるので帰宅前にエアコンを先につけておく、というような事ができます。

また、毎日決まった時間にボタンを実行するなどのスケジュール機能や、一つのボタンに複数のボタン押下シーケンスを組み込むマクロ機能もあるので、いろいろな操作を一アクションにまとめることができます。

今回はこのスケジュール機能を使ってZIP!deポン!を自動化してみます。

## やりたいこと

まずやりたいことを決めましょう。

やりたいことは、以下の一連の流れです。
1. 私が寝ている時間帯のゲームの時にTVをつけ
2. 青赤緑黄のカラーボタンのいずれかを押して
3. 当たりか外れかを見定めて
4. TVの電源を切る

3で当たりか外れかを見定める理由としては、データ放送の注意点として以下の注意事項があるためです。
> 「ZIP!deポン!」の各コーナー中、リモコンの色ボタンで選択後にテレビの電源OFFやチャンネル選局などで、ゲーム結果をご確認していない場合、ポイントが加算されません。ご注意ください。


## やってみる

気をつけたいのが、ZIP!deポン!は「6:20頃」「6:50頃」「7:50頃」とありますが、
「頃」とある通り、きっちりその時間に始まるわけではなく、数分のズレがあります。

なのでそのズレを吸収しなければなりません。

ここでは手っ取り早く前3分、後7分くらいの範囲でTVを付け、その間一定間隔でカラーボタンをいい感じの時間をあけつつ押して見ることにします。

※本当であればマクロ機能を使ってワンボタンでスケジュール実行したかったのですが、
残念ながらスケジュール実行はマクロに対応していないので個別でスケジュールを組んでいます。

やりたいことを実現するために、以下の4つのボタンを作りましょう。
※赤である必然性は特にはないのですが、どのボタンを押してもきちんと動作していれば30ポイント取得できるはずなのでどれでも大丈夫です。

- 「TVの電源ON」ボタン
- 「4チャンネル切替え」ボタン
- 「カラーボタン赤」ボタン
- 「TVの電源OFF」ボタン

ボタンは iRemoconの [UIデザイナー](http://i-remocon.com/select-uidesigner/) で作成していきます。


次に、端末上でiRemoconアプリから「リモコンタイマー設定」で各ボタンのスケジュールを設定します。

### 12/4時点の初期設定
各回の開始3分前からTVを付け、TV電源ONから1分後に4chに切り替え。
並行して、毎分赤ボタンを送出するようにスケジュール。
恐らくゲームが終ったであろう7分後にTV電源OFFする。

| ボタン           |      スケジュール     |
|:----------------:|:---------------------:|
| 赤ボタン         | 毎分                  |
| TVの電源ON       | 毎日 6:17, 1日毎 6:47 |
| 4ch切り替え      | 毎日 6:18, 1日毎 6:48 |
| TVの電源OFF      | 毎日 6:27, 1日毎 6:57 |

### 12/5に修正した設定
12/5の結果を受け、もしかしたら電源OFFが早すぎるのかも？という仮説のもと、電源OFFをそれぞれ3分遅くした。
他の設定はそのまま。

| ボタン           |      スケジュール     |
|:----------------:|:---------------------:|
| 赤ボタン         | 毎分                  |
| TVの電源ON       | 毎日 6:17, 1日毎 6:47 |
| 4ch切り替え      | 毎日 6:18, 1日毎 6:48 |
| TVの電源OFF      | 毎日 6:30, 1日毎 7:00 |


## どうなったか？

12/4から上記設定で運用を始め、一週間の成果は以下の通りです。

| 日付             | 成果                  | 獲得ポイント | 累計ポイント |
|:----------------:|:----------------------|:------------:|:------------:|
| 12/4 (月)            | 自動タイマー処理が上手くできてなかったため6:20と6:50は取り逃す。 <br> 1分毎に赤ボタンを押すように変更。 <br>  7:50のZIP!deポン!は1ポイント取得。 | 1P | 1P |
| 12/5 (火)             | 6:20と6:50のどちらかは成功(ハズレ)してどちらかは失敗、1ポイント取得。 <br> 7:50は正解、3ポイントゲット。<br> 失敗原因を「電源OFFが早すぎた可能性がある」と仮定。<br>→電源OFFを各回開始後7分後OFFを10分後OFFに延長。 | 4P | 5P |
| 12/6 (水)             | 6:20と6:50のどちらかは成功(当たり)してどちらかは失敗、3ポイント取得。 <br> 7:50はハズレ、1ポイントゲット。<br> また失敗してしまったが、この日は特に設定を変更せずに様子見。 | 4P | 9P |
| 12/7 (木)             | 6:20と6:50のどちらかは成功(当たり)してどちらかは失敗、3ポイント取得。 <br> 7:50はハズレ、1ポイントゲット。<br> どっちが失敗しているのか謎。切り分けのため6:20を一時無効にしてみる。 | 4P | 13P |
| 12/8 (金)             | 6:50は成功(ハズレ)、1ポイント取得。 <br> 7:50は当たり、3ポイントゲット。<br> 6:20が失敗している模様。6:20は２択なので押すボタンの問題か？ | 4P | 17P |

### 余談: 7:50の回のZIP!deポン!の開始/終了時刻

開始/終了時刻は結構ばらつきがある感じです。

| 日付                 | 開始時刻 | 終了時刻 |
|:--------------------:|:--------:|:--------:|
| 12/4 (月)            | 7:55     | 7:57     |
| 12/5 (火)            | 7:56     | 7:58     |
| 12/6 (水)            | 7:53     | 7:55     |
| 12/7 (木)            | 7:54     | 7:56     |
| 12/8 (金)            | 7:53     | 7:55     |

## 今後の展望

- 現状はカラーボタンを毎分押しているのでひょんな時に誤動作しそうなので必要なタイミングでのみ送出するようにしたい。
- ゲストが勝つ可能性が高いのでメインメンバー以外の人がでていたらそのボタンを押す、などの顔認識ができたらいいな。
- Google Homeに聞いたら答えを教えてくれるようなことができると楽だな。

## まとめ

一切頑張らずに1週間で17ポイントも集まったので２週間あれば20ポイントは余裕でいけますね。
みなさんも頑張らない懸賞生活をエンジョイしましょう！

ではでは