はじめに
ラズベリーパイを使用して家電を操作する方法を説明します。
具体的に実現したいことを章立てして説明して行きます。
⑴ ラズベリーパイを学習リモコンに(エアコン以外)
⑵ ⑴で作った学習リモコンを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の設定
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 の設定
[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 ファイルを作成します。
[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を作成してください。
必要なライブラリは
pip3 install line-bot-sdk
pip3 install eventlet
デフォルトだとラズパイはpythonのパスは2系に通ってるので、
3系で書きたい場合は3を通してください。
callback.pyを
/home/pi/line_bot/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 から リッチメニューやカードタイプメッセージを作成すると見栄えがよくなります。
つづき
LINE bot で外出先から家電操作(2019年10月31日最新版) 中編
https://qiita.com/llight/items/2c739b39fd033c77bcab
分かりにくい部分がありましたら逐次質問受け付けます。