LINE bot で外出先から家電操作（2020年 7月23日最新版) 　前編

# はじめに

ラズベリーパイを使用して家電を操作する方法を説明します。
具体的に実現したいことを章立てして説明して行きます。

⑴ ラズベリーパイを学習リモコンに（エアコン以外）
⑵ ⑴で作った学習リモコンをLINE Botで外出先から操作
⑶ 物理スイッチを作成して鍵の施錠を行う
⑷ エアコンの信号を解析してエアコンも操作

**今回は前編のため(1)〜(2)までです。**
# 動作環境
・RaspberryPi3  Raspbian GNU/Linux 10 (buster)
・python 3.8.3 
・nginx  1.14.2 

### ラズパイのOSバージョンの確認方法

```sh:
pi@raspberrypi:~ $ lsb_release -a
```

Pythonのバージョンはターミナルでpythonと打てばインタプリタの画面で確認できるはず。
**pyenv を使用している方は　sudo python でバージョンが変わらないように注意**

バージョンが異なる場合　/etc/sudoersにpyenvのパスを追加しておきましょう。



# (1) ラズベリーパイを学習リモコンに（エアコン以外）

エアコンのみ信号が長いため(4)で説明します。

## 受信機の作成
**lirc** で作成しようとすると不具合が多いため、Pythonの**pigpio**を使用します。


以下の記事を参考にしました。
格安スマートリモコンの作り方
https://qiita.com/takjg/items/e6b8af53421be54b62c9

```py:
python3 irrp.py -r -g18 -f codes light:on --no-confirm --post 130
```
このコマンドで信号を学習できるようになると思います。


## 送信機の作成

こちらも上述の記事が参考になります。
回路図も上述のページに参考サイトが記載してあります。


回路図について理解できなかった人ように解説しました。
https://qiita.com/llight/items/d9925c7cb385b2f5baa2

```py:
python3 irrp.py -p -g17 -f codes light:on
```
このコマンドで送信できるように準備してください。


# ⑵ ⑴で作った学習リモコンをLINE Botで外出先から操作

ここまではほぼ引用でした。


## nginxのインストール

http/httpsサーパーのnginx をインストールしてください

```sh:ラズパイ上で
＄　sudo apt install nginx
```

## uwsgiのインストール

アプリケーションサーバのuwsgiをインストールしてください。

```sh:ラズパイ上で
＄　sudo pip3 install uwsgi
    sudo apt-get install uwsgi-plugin-python3
```

## nginx の設定



## ネットワークの設定
###自宅のグローバルIPアドレスに対応するドメインの取得とDDNSの設定


MyDnsで無料でできます。
https://www.mydns.jp
こちらが参考になります。
https://imoni.net/tips/00xx/0010.html
MyDNSでドメイン取得から自動更新まで解説してあります。

成功できればグローバルIPアドレスでラズパイにssh接続できるはずなので確認してみてください。
ちなみにその場合はローカルにある端末ではなく外部にある端末から行わないとグローバルIPアドレスは無効になる（正確には参照できない）ため、外部のPCから試して見てください。
手っ取り早いのはiPhoneのテザリング機能を使用して見てください。


###ポートフォワーディングの設定
ルータの画面で設定して見てください。
(デフォルトだとだいたい192.168.0.1)
自分の環境はイッツコムであったので、ルータ詳細設定　→　ポートフォワード設定
にてラズパイのIPアドレスをポート番号を指定しました。

このように設定することでWAN側から指定ポートのルータのグローバルIPアドレスにアクセスすると
指定したローカルIPアドレスに転送（アクセス）できます。
（今回はグローバルIPアドレスからラズパイ）


追記：ポート80(http)/443(https)についてもポートフォワーディング設定を行ってください。

これでネットワークの設定はひとまず終わりです。

##アクセステスト
ここまででnginxで立てたサーバーにドメインをブラウザに入力するだけでアクセスできます。
念のため確認してみましょう。


```sh:ラズパイ上で
＄　sudo systemctl restart nginx
```

### テスト１
まずnginxのサーバを立てます。
ラズパイ上からブラウザのURLにlocalhostと入力すれば
Welcome to nginx! と表示されるはずです。

### テスト２
http://[グローバルIPアドレス]でアクセスすると同様の画面が表示されるはずです。
(LAN外からアクセスしてください。iphoneとかから）
できない場合にはポートフォワーディングの設定とファイアフォールの設定がうまく言っていない可能性があります。

### テスト3
http://[ドメイン名]でアクセスすると同様に/var/www/htmlへアクセスできます。

できない場合はMyDNSの設定がうまくいっていない可能性があります。

**ちなみに/etc/dhcpcd.conf の設定でname_server の設定がうまくできていなくても接続に失敗します。**
ラズパイ上で以下のコマンドを打って、しっかりとグローバルIPが帰ってくるか確認してください。

```sh:
＄　sudo curl inet-ip.info
```

## Let's encrypt でSSL証明書取得
LINEBotのwebhookではhttps通信でないといけないため証明書が必要です。

```sh:ラズパイ上で
＄sudo apt-get install certbot
 python-certbot-apache
＄certbot certonly --webroot -w /var/www/html/ -d abcdefg.xyz.ne.jp(ドメイン名）

```
 - Congratulations! Your certificate and chain have been saved at
 と表示されれば成功。

後は証明書をnginxに組み込ませてあげるだけ。

## nginxの設定




```sh:/etc/nginx/sites-enabled/defaultに追記
server {
	listen 80 default_server;
	listen [::]:80 default_server;

	#SSL configuration
	listen 443 ssl;
	ssl_protocols       TLSv1.2 TLSv1.1 TLSv1;
    ssl_ciphers         ALL:!aNULL:!SSLv2:!EXP:!MD5:!RC4:!LOW:+HIGH:+MEDIUM;
    ssl_certificate     /etc/letsencrypt/live/ドメイン名/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;
    ssl_session_timeout 10m;

　　root /var/www/;
　　server_name ドメイン名;
　　location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		try_files $uri $uri/ =404;
　　　}
    location /uwsgi {
        include uwsgi_params;
        uwsgi_pass unix:/tmp/uwsgi.sock;
    }
    
}

```
このように設定。
CRTと鍵ファイルは先程のLet's encryptで作成したものを使用


## uwsgi.ini の設定

```任意のdir/uwsgi.ini:
[uwsgi]
uid = [あなたのユーザ名]
gid = [あなたのグループiD]
master = true 
socket = /tmp/uwsgi.sock
chmod-socket = 666
wsgi-file = /home/pi/line_bot/callback.py     #ここは先程のlinebotのプログラムのパス
pidfile= /home/pi/line_bot/pid/uwsgi.pid　    #プロセスIDを吐き出すパス
logto = /home/pi/line_bot/log/uwsgi.log   　　 #ログを吐き出すパス
```

/etc/systemd/system/uwsgi.service　ファイルを作成します。

```/etc/systemd/system/uwsgi.service:
[Unit]
Description = uWSGI
After = syslog.target

[Service]
ExecStart = /usr/bin/uwsgi_python3 --ini /home/pi/line_bot/uwsgi.ini #注意

Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target
```
/usr/bin/uwsgi_python3　は pyenv環境であれば異なります
which uwsgi_python3 より確認してください。

また設定を変更した場合
systemctl daemon-reload　を行わないと反映されないので注意

これでsystemctlで使えるようになります。

```
systemctl enable uwsgi
```

以上で自動起動の設定が完了です。






## LINEbotの作成

Raspberry pi 3 を使って、 LINE から 赤外線リモコンを操作（その３：LINE から 赤外線リモコンを操作）
https://qiita.com/na59ri/items/45b756163aab6c60da0a

上述の記事を参考にLineBotを作成してください。
必要なライブラリは

```sh:pi
pip3 install line-bot-sdk
pip3 install eventlet
```

デフォルトだとラズパイはpythonのパスは2系に通ってるので、
3系で書きたい場合は３を通してください。


callback.pyを
/home/pi/line_bot/callback.pyに作成しましょう。

上述の記事のプログラムだと

```sh:callback.py
 # line で hot と入力したら、暖房を入れ、"hot ok" とlineを返す 
        if( text == "hot" ):
            replyMessage = 'hot ok'
            os.system("irsend SEND_ONCE aircon hoton")
```
このように書かれていますが、今回は　「irsend SEND_ONCE aircon hoton」
の部分を(1)で作成した赤外線リモコンを操作するコマンドに変えてください。

また、hot や　hot ok といったメッセージも自信で好きな文字に設定してください。


これで(2)が完成です。


とりあえず完成するとこんな感じでLineBotから家電を操作できます。
LINE Oficial Account Manager から　リッチメニューやカードタイプメッセージを作成すると見栄えがよくなります。
<img width="414" alt="sample.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264607/3209af48-905d-a80b-0e8d-e7a8d211f760.jpeg">



#つづき
LINE bot で外出先から家電操作（2019年10月31日最新版) 　中編
https://qiita.com/llight/items/2c739b39fd033c77bcab
分かりにくい部分がありましたら逐次質問受け付けます。