Raspberry pi 3 を使って、 LINE から 赤外線リモコンを操作（その１：赤外線リモコンからエアコンを操作）

# はじめに
出先からおうちの家電を動かしたい！ということで、
LINE　の Messaging API （webhook） を利用し、
Raspberry pi 3 経由で、赤外線を使って、
おうちの家電製品を操作するような仕組み作りました。
備忘録として、思い出しながら記載します。

今回の構成は以下の通りです。
LINE -> raspberry pi(httpsサーバ) -> 赤外線リモコン -> エアコン

以下の通り分けて説明します
- 赤外線リモコン から エアコン を操作（今回）
- [httpsサーバ（apache + mod_wsgi） の構築](https://qiita.com/na59ri/items/01c6b5c08b4b2e9e4486)
- [LINE から 赤外線リモコンを操作](https://qiita.com/na59ri/items/45b756163aab6c60da0a)

# 必要機材
Raspberry pi 3
赤外線リモコン受信モジュール：PL-IRM2121(38kHz)
赤外線LED：OSI5FU5111C-40
NPNトランジスタ：2SC1815-GR
抵抗：45Ω(赤外線LED脇)、500Ω（出力用GPIO脇）

# 環境
OS: Raspbian 9.1
赤外線リモコンデーモン：lircd 0.9.4c
**バージョンによって、設定方法など変わることに注意**

# 手順

## 1. Raspberry pi 3 に赤外線受信/送信するための回路を構築

具体的な回路構成は
[(1)Raspberry Pi 2を赤外線リモコンで操作可能にする] (https://yagi.tc/archives/2017/03/28/raspberry-pi-2-ir-reciever/) 
や
[(2)Alexa Skills Kit + AWS IoT + Raspberry Pi + 赤外線LED でテレビリモコンを作る](http://blog.akanumahiroaki.com/entry/2017/12/08/080000)
を参考にしてください。
**赤外線LEDやNPNトランジスタの配線に注意**
**自分はデータシートの見方、展開図の方向を間違えておりハマりました**

GPIOの接続は、以下の通り繋げていることを前提にします。
- 赤外線リモコン受信モジュールからGPIOへの入力：GPIO 18
- GPIOからNPNトランジスタへの出力：GPIO 17


## 2. 赤外線リモコンデーモン のインストール と 設定

まずは、赤外線リモコンデーモンである lircd のインストールする

```terminal:terminal
$ sudo apt-get install lirc
```

lirc をインストール後、lircd の設定ファイルを２行修正する

```terminal:terminal
$ sudo emacs /etc/lirc/lirc_options.conf

driver = default
device = /dev/lirc0
```

さらに、利用するgpioの設定するために、一番下の行に以下を追加する
(＝や, の間に空白は入れないようにする)

```terminal:terminal
$ sudo emacs /boot/config.txt

dtoverlay=lirc-rpi:gpio_out_pin=17,gpio_in_pin=18,gpio_in_pull=up
```


システムを再起動する

```terminal:terminal
$ sudo reboot
```

## 3. エアコンリモコンから赤外線のパターンを取得
赤外線リモコン受信するために、lircd を停止する

```terminal:terminal
$ sudo /etc/init.d/lircd stop
```

赤外線リモコンを受信するために、待ち受け状態にする。

```terminal:terminal
$ mode2 -d /dev/lirc0
```

コマンド入力後、エアコンのリモコンを赤外線リモコン受信機モジュールに向けてボタンを押すと、
以下の通りに表示する(Crtl + c で終了)

```text:terminal
pulse 5689
space 29388
pulse 3384
space 1785
pulse 376
space 1335
pulse 395
space 467
pulse 401
space 464
pulse 419
space 448
・・・
```

mode2 を利用して、赤外線のデータを取得するには、以下のコマンドを実行する
（コマンドを実行したフォルダに、 **OFF** というファイルができる）

```terminal:terminal
$ mode2 -d /dev/lirc0 | tee OFF
```

エアコンのリモコンから取得した赤外線データを赤外線送信するために、
以下の ruby の実行ファイルを使う
実行ファイルは [(5)Slack経由で家の外からエアコンをon, offできる装置を、Raspberry Piで作ってみた](https://qiita.com/KAKY/items/55e6c54fa2073cdc0bbe) から抜粋し、さらに、１行80文字程度に抑える処理も追加

```ruby:parse.rb
# coding: utf-8
lines =  File.open(ARGV[0]).readlines #行ごとに配列として読み込み
lines_without_first = lines.slice(1..-1) #先頭の行は不必要なので省く
str = lines_without_first.map{|line|line.split(" ")[1]}.join(" ") #整形して表示

# 1行80文字以内に抑える処理
items = str.split(" ")

count = 0
items.each do |item|
  count += item.length
  if count < 80 then
    print(item," ")
  else
    print(item," \n")
    count = item.length
  end
  count += 1
end
```

OFFファイル　を　赤外線送信できる形式に変更するコマンドは以下の通り実行する

```terminal:terminal
$ ruby parse.rb OFF
```

出力は以下の通り表示される

```text:OFF
5689 29388 3384 1785 376 1335 395 467 401 464 419 448 ・・・
```

terminalに出力した、OFFファイルのデータを格納するために、
以下のファイルを作成する

```terminal:terminal
$ sudo emacs /etc/lirc/lircd.conf.d/aircon.lircd.conf
```

以下のように、内容を記載し、特に、
OFFファイルのデータを name off 以下にコピペする
（コピペデータは parseから始まり、spaceで終わるようなデータでないとエラーになる）

```text:aircon.lircd.conf
begin remote
  name  aircon
  flags RAW_CODES
  eps   30
  aeps  100
  gap   200000
  toggle_bit_mask 0x0

  begin raw_codes

name off
5689 29388 3384 1785 376 1335 395 467 401 464 419 448 ・・・

name hoton
（暖房をONした時のデータを入れる）

name iceon
（冷房をONした時のデータを入れる）

  end raw_codes
end remote

```


## 4. 赤外線データの正規化

赤外線送信データは業界標準フォーマットが２つ存在している
[(6)赤外線リモコンフォーマット](http://akizukidenshi.com/download/k4174_format.pdf)　を参照ください

- NECフォーマット
- 家電協フォーマット

各自のリモコンがどちらのフォーマットで動作しているかはparseとspaceの組み合わせで推測ください。
ここでは、家電協フォーマットを前提で進める。

3章の parse.rb に、赤外線データを家電協フォーマットに正規化する処理を追加したファイルは以下の通りである。
正規化の方法は自分が持っていたリモコンをベースに実装しているため、取得したいリモコンの赤外線データによっては
実装を変えて使ってください

```ruby:parse_opt.rb
# coding: utf-8
lines =  File.open(ARGV[0]).readlines #行ごとに配列として読み込み
lines_without_first = lines.slice(1..-1) #先頭の行は不必要なので省く
str = lines_without_first.map{|line|line.split(" ")[1]}.join(" ") #整形して表示

items = str.split(" ")

count = 0
items.each do |item|
  count += item.length

# 赤外線データを家電協フォーマットに正規化
  value = Integer(item)
  if value < 800 then
    value = 400
  elsif value < 1400 then
    value = 1200
  elsif value < 2000 then
    value = 1600
  elsif value < 4000 then
    value = 3200
  else
  end
    
# 1行80文字以内に抑える処理
  if count < 80 then
    print(value," ")
  else
    print(value," \n")
    count = item.length
  end
  count += 1
  
end
```

OFFファイルに対して、上記のrbファイルの実行方法は以下の通りである。

```terminal:terminal
$ ruby parse_opt.rb OFF
```

出力は以下の通りになる

```text:output
5689 29388 3200 1600 400 1200 400 400 400 400 400　・・・
```

この出力を見てみると、先頭から見て２つ目のデータが、
space 29388 であり、これは、リモコンフォーマットを見てみると、
フレーム開始前になることから、それ以前のデータは削除する

aircon.lircd.conf　ファイルの変更するため、以下のコマンドを実行する

```terminal:terminal
$ sudo emacs /etc/lirc/lircd.conf.d/aircon.lircd.conf
```

記載するデータは以下の通りになる。
（記載するデータは parseから始まり、spaceで終わるようなデータでないとエラーになる）


```text:aircon.lircd.conf
begin remote
  name  aircon
  flags RAW_CODES
  eps   30
  aeps  100
  gap   200000
  toggle_bit_mask 0x0

  begin raw_codes

name off
3200 1600 400 1200 400 400 400 400 400　・・・

name hoton
（暖房をONした時のデータを入れる）

name iceon
（冷房をONした時のデータを入れる）

  end raw_codes
end remote
```

## 5. 赤外線データを赤外線送信機で送出

赤外線送信するために、lircd を再開する

```terminal:terminal
$ sudo /etc/init.d/lircd start
```

赤外線送信できるデータを確認するために、以下のコマンドを実行する

```terminal:terminal
$ irsend LIST '' ''
```

すると、以下のフィードバックが返却される

```text:terminal
aircon
```

さらに、 aircon にどのようにコマンドがあるか調べる

```terminal:terminal
$ irsend LIST aircon ''
```

すると、以下のフィードバックが返却される

```text:terminal
0000000000000001 off
0000000000000002 hoton
0000000000000003 iceon
```

aircon の off コマンドを使う場合には、以下のコマンドを実行する

```terminfo:terminal
$ irsend SEND_ONCE aircon off
```

これで、エアコンがOFFになる
もちろん、赤外線LEDがきちんとエアコンに向いていないと反応しない　ので注意が必要！


# 参考URL
(1)[Raspberry Pi 2を赤外線リモコンで操作可能にする] (https://yagi.tc/archives/2017/03/28/raspberry-pi-2-ir-reciever/)
(2)[Alexa Skills Kit + AWS IoT + Raspberry Pi + 赤外線LED でテレビリモコンを作る](http://blog.akanumahiroaki.com/entry/2017/12/08/080000)
(3)[Raspberry Pi 3 Model B で赤外線リモコン学習＆操作](http://takuborn.hatenablog.jp/entry/2017/12/05/224039)
(4)[Raspbian Stretchで LIRC機能を使った学習リモコン、赤外線リモコンを動かす方法](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_stretch_lirc_ir_remote_control_2017/)
(5)[Slack経由で家の外からエアコンをon, offできる装置を、Raspberry Piで作ってみた](https://qiita.com/KAKY/items/55e6c54fa2073cdc0bbe)
(6)[赤外線リモコンフォーマット](http://akizukidenshi.com/download/k4174_format.pdf)