1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-20

はじめに

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

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

今回は前編のため(1)〜(2)までです。

動作環境

・RaspberryPi3 Raspbian GNU/Linux 10 (buster)
・python 3.8.3
・nginx 1.14.2

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

pi@raspberrypi:~ $ lsb_release -a

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

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

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

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

受信機の作成

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

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

python3 irrp.py -r -g18 -f codes light:on --no-confirm --post 130

このコマンドで信号を学習できるようになると思います。

送信機の作成

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

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

python3 irrp.py -p -g17 -f codes light:on

このコマンドで送信できるように準備してください。

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

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

nginxのインストール

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

ラズパイ上で
$ sudo apt install nginx

uwsgiのインストール

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

ラズパイ上で
$ 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で立てたサーバーにドメインをブラウザに入力するだけでアクセスできます。
念のため確認してみましょう。

ラズパイ上で
$ sudo systemctl restart nginx

テスト1

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

テスト2

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

テスト3

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

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

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

$ sudo curl inet-ip.info

Let's encrypt でSSL証明書取得

LINEBotのwebhookではhttps通信でないといけないため証明書が必要です。

ラズパイ上で
$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の設定

/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 から 赤外線リモコンを操作(その3:LINE から 赤外線リモコンを操作)
https://qiita.com/na59ri/items/45b756163aab6c60da0a

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

pi
pip3 install line-bot-sdk
pip3 install eventlet

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

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

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

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 から リッチメニューやカードタイプメッセージを作成すると見栄えがよくなります。
sample.jpg

つづき

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

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?