Amazonファミリー会員なのに、プライムビデオを見ないのはもったいないっという動機で、セットアップしたOSMC(Raspberry Pi 3B+)ですが、新型ウィルスによる外出自粛で思いのほか活躍しています。
HDMI連動によりテレビのリモコンからも操作出来るとこが良いですね。あまり見ませんが、YouTubeも見れますし(APIの取得が面倒ですが)。
今回は、OSMCをOSとしたRaspberry Pi 3B+で音声操作できる赤外線リモコンを作成しました。
追記:本システムに利用しているIFTTTが2020/10に有料化し、めでたく不要の産物になりました。
格安スマートリモコンの作り方
https://qiita.com/takjg/items/e6b8af53421be54b62c9
以下、参考サイトと言うと、ここを指します。
参考サイトで、RaspbianをOSとしたRaspberry Pi Zeroで音声操作できる赤外線リモコンの作り方が解説されています。最初はラズパイZeroを使って、手順通り進めると、ラズパイ赤外線)とGoogleHomeを使ったテレビの音声操作することができました。
ラズパイZeroで作ったものの、せっかくならテレビの横に常駐しているOSMC(Raspberry Pi 3b+)で音声操作できた方が便利かなと思い、やってみたところ、無事できました。どちらのOSもDebianをベースにしているので、ほぼ同じ手順でいけましたが、いくつかの細かい点で相違があったので記事にします。
とりあえず、購入時の箱に入れて運用しています(ダセェ)。
目次
- 回路作成
- Sambaのインストール
- pigpioのインストール
- pigpioの常駐化
- nodejsとnpmのインストール
- hubotのインストール
- hubotにコマンド登録
- Slackの設定
- IFTTTの設定
- 追:繰り返し処理コマンド追加
回路の作成
基板自体はこうなりました。参考サイトとは赤外線の受信ICを接続するピン位置が異なっていて、18ピンではなく、25ピンにしました。その方が収まりがよかったので。計画の画はLEDを3つ別方向に取り付けるつもりでしたが、取り敢えず1つにしてて、しかもプラスマイナスを間違えたので微妙に配線が異なりますorz
また、抵抗は手持ちの関係で、27Ωてはなく22Ωを使っています。今のところはLEDが焼き切れたりはなく、正常に動作してます。
Sambaのインストール
これはしなくてもいいんですけど、ファイルを送るのに便利なので(今回はファイルはZeroで作成済みだったのでコピペしたかった)。OSMCはGUIからの操作でもSambaをインストール可能なはずですが、私の環境ではなぜかUpdatesエラーになりましたので、SSHでコマンドからインストールしました。
OSMCで共有フォルダを設定する(GUIからのSambaインストール)
http://nomux2.com/post-1713/
SSHでのインストール。ユーザー名はデフォルトのosmcであることが前提の設定です。
●インストール
sudo apt-get update
sudo apt-get install samba
●設定ファイルを開く
sudo nano /etc/samba/smb.conf
末尾に追加
[osmc]
comment = OSMC
path = /home/osmc
guest ok = yes
read only = no
browsable = yes
force user = osmc
pigpioのインストール
GIPO制御ライブラリpigpioをインストールします。Raspbianの場合はaptからインストールするだけなのですが、OSMCのパッケージリストには含まれていないため、インストール方法が異なります。開発者のサイトの方法に従いインストールします。
●Pythonのセットアップツールのインストール
sudo apt install python3-setuptools
●pigpioのインストール
wget https://github.com/joan2937/pigpio/archive/master.zip
unzip master.zip
cd pigpio-master
make
sudo make install
これだけでPythonプログラムは動くのかなぁっと思いましたが(aptにおけるpython3-pigpioがないため)、ちゃんと動きました。
●pigpioの開始
sudo pigpiod
停止する場合は
sudo killall pigpiod
pigpio library Download & Install(開発者のサイト)
http://abyz.me.uk/rpi/pigpio/download.html
pigpioの常駐化
aptでのインストールと異なり、常駐するプログラムには登録されていないので、手動で登録します。常駐しない場合は不要です。最初にしなくても、すべてを通して動作を確認した後、最後にしてもよいです。
●定義ファイルの作成
sudo nano /etc/systemd/system/pigpiod.service
ファイル内容
[Unit]
Description = pigpio daemon
[Service]
ExecStart = /usr/local/bin/pigpiod
Restart = always
Type = forking
[Install]
WantedBy = multi-user.target
Raspberry Pi 3 systemdでpigpiodの自動起動
https://hakengineer.xyz/2017/09/22/post-318/
上記サイト(Raspbian)と異なる点はExecStartのパス。which pigpiod
で確認します。
●設定のリロード(ファイルを変更した場合に必要)
sudo systemctl daemon-reload
●サービスを認識しているかの確認
sudo systemctl list-unit-files --type=service | grep pigpiod
pigpiod.serviceがあればOK。私の場合はステータスはstaticになってました。
●自動起動の有効化
sudo systemctl enable pigpiod.service
無効する場合には
sudo systemctl disable pigpiod.service
●確認
sudo systemctl status pigpiod.service
pigpiod.serviceがenabledになっていればOK
●サービス開始
sudo systemctl start pigpiod.service
GPIOピンの設定
17ピンを出力、25ピンを入力に設定します。
echo 'm 17 w w 17 0 m 25 r pud 25 u' > /dev/pigpio
ちなみに、下のような返しがあったらpigpioか開始されていません。
-bash: /dev/pigpio: Permission denied
●起動時の自動設定
crontab -e
でファイルを開いて(初めての場合は、どのエディタで編集するか聞かれる)、最後の行に以下の1行を追加して保存。
@reboot until echo 'm 17 w w 17 0 m 25 r pud 25 u' > /dev/pigpio; do sleep 1s; done
この時点で赤外線の送受信の確認をすべきですが、その辺は参考サイトを見てください。
nodejsとnpmのインストール
このシステムではslackというチャットサービスを通信サーバーに利用してネット上からラズパイを操作しますが、slack上のメッセージの監視、メッセージに応じた処理の実行にhubotというアプリケーションを使用します。そのhubotの実行にnodejs、インストールにnpmが必要です。
手順としてはnodejs、npmの順にインストールします。
nodejsはaptから普通にインストールすると最新版にならず、その後のnpmのインストールに支障をきたすので、下記のコマンドでインストールします。
●nodejsのインストール
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs
現時点で、安定版がv10、開発版がv12なので、v10にしました。
●インストールの確認
node -v
バージョンが返ってきます。もし、nodejs -v
では返ってくるものの、nodeではコマンドエラーになる場合は下記をするそう。
sudo ln -s /usr/bin/nodejs /usr/bin/node
●npmのインストール
curl -O -L https://npmjs.org/install.sh
sudo sh install.sh
●インストール確認
npm -v
ちなみに古いnodejsだと、npmインストール時にSyntaxError(構文エラー)を吐きました。
Raspberry Pi 3 Model Bに最新のNode.jsとnpmをインストールする[公式準拠]
https://qiita.com/Avocado/items/512f64428545bf0d94ba
Installing node.js and npm on OSMC on Raspberry Pi
http://unibeaverse.blogspot.com/2015/08/installing-nodejs-and-npm-on-osmc-on.html
curl http://npmjs.org/install.sh | shで失敗する人へ
https://qiita.com/Gaddict/items/af982987cad9e8ca4aab
hubotのインストール
hubotの他、redisというデータを保管するライブラリと、参考サイトの作者が作ったhubotの拡張スクリプトをインストールします。
●hubotのインストール
sudo npm install -g yo generator-hubot
●hubotの雛形作成
mkdir homebot
cd homebot
yo hubot
? Owner # メールアドレスなど、空欄でも可
? Bot name # 「homebot」と入力
? Description # なんでも
? Bot adapter # 「slack」と入力
●redisのインストール
sudo apt install redis-server
●拡張スクリプトのインストール
npm install hubot-broadlink-rm
●hubotの設定
sudo nano external-scripts.json
ファイル内容
[
"hubot-heroku-keepalive", #この行を削除
"hubot-broadlink-rm", #この行を追加
]
●hubotの不要(非推奨)ファイルの削除
rm hubot-scripts.json
●動作確認
bin/hubot
homebot> ping
homebot> PONG
pingと打つとPONGと返ってくる。終了はCtrl+d。
hubotにコマンド登録
hubotに赤外線送受信のコマンドを登録します(送受信がうまくいくかは事前に参考にサイトに従ってチェック)
●送受信プログラム(Python)のダウンロード
curl http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip | zcat > irrp.py
●プログラムをhomebot内のbinに移動
mv irrp.py homebot/bin
●homebot内にデータ保管フォルダ作成
mkdir data
●学習用コマンド作成
sudo nano bin/pi-learn.sh
ファイル内容
#!/bin/sh
name=$1
python3 bin/irrp.py -r -g25 -f data/pigpio.json --no-confirm --post 130 "$name"
●実行用コマンド作成
sudo nano bin/pi-send.sh
ファイル内容
#!/bin/sh
name=$1
python3 bin/irrp.py -p -g17 -f data/pigpio.json "$name"
●権限の設定
chmod 755 bin/pi-learn.sh bin/pi-send.sh
●動作確認
bin/pi-learn.sh tvon
bin/pi-send.sh tvon
●hubotにコマンド登録
bin/hubot
homebot>homebot command pi:learn bin/pi-learn.sh '#'
set !pi:learn to bin/pi-learn.sh '#'
homebot>homebot command pi bin/pi-send.sh '#'
set !pi to bin/pi-send.sh '#'
●動作確認
homebot> send pi:learn(lightoff)
bin/pi-learn.sh 'lightoff'
Recording
Press key for 'lightoff'
Okay
homebot> send pi(lightoff)
bin/pi-send.sh 'lightoff'
Ctrl+dで終了
Slackと接続
SlackはPCから設定しました。
●Slackアカウント作成(無料)
略
●hubotアプリを追加
右メニュ→App→hubotと検索→Hubotを追加
●TOKENの取得
Hubot→設定→TOKENをコピー
●TOKENの設定
nano bin/hubot
ファイル追記
export HUBOT_SLACK_TOKEN=xxxxxxxxxxxxxxxxx # をexecの前に追加
●動作確認
bin/hubot --adapter slack
INFO Logged in as homebot···
と出ていたらOK。Ctrl+cで終了。
●Slack起動コマンドの作成
nano bin/homebot.sh
ファイル内容
#!/bin/sh
cd /home/osmc/homebot
sudo bin/hubot --adapter slack
最初は最後の部分をsudo -u osmc bin/hubot --adapter slack
としていましたが下記のエラーがでました。
Sorry, user osmc is not allowed to execute 'bin/hubot --adapter slack' as osmc on osmc.
●常駐化登録
sudo nano /etc/systemd/system/homebot.service
ファイル内容
[Unit]
Description = hubot for smart home
[Service]
ExecStart=/home/osmc/homebot/bin/homebot.sh
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
●自動開始設定
sudo systemctl enable homebot
●開始
sudo systemctl start homebot
IFTTTと接続
IFTTTのサービスを利用して、Google HomeからSlack投稿を行います。PC(ウェブサイト)でアカウント登録、設定を試みましたが、登録はできたものの、設定は画面操作がまったくわからずできませんでした。
iPhoneアプリでやるといとも簡単にできたので、アプリで作業することをお勧めします。
追記:IFTTTは2020年10月8日に3つアプレットに制限が付き、実質有償化しました
●アカウント取得(無料)
略
●アプレットの追加
Make your own Applets from scratch横の+ボタンをタップ
→ This横の+をタップ
→ googleと検索 → Google Assistantを選択
→ Say a simple phraseを選択
→ What do you want to say?に「テレビをつけて」と入力
LanguageをJapaneseに → Create trigger
→ That横の+をタップ
→ slackと検索 → Slackを選択
→ Post to channelを選択
→ Which channel?をDirect Messages @homebot
Messageに「send pi(tvoff)」と入力 → Create action
→ Finishをタップ
いずれ繰り返し処理やちょっと複雑なこともやってみたいですね。
追記:
繰り返し実行コマンド
例えば、CMを飛ばすときに30秒を5回実行するとか、そんな繰り返し処理を実装してみました。
●コマンドファイル作成
cd homebot
nano bin/pi-repeat.sh
ファイル内容
#!/bin/sh
set -- $1
name=$1
repeat_n=$2
for i in `seq $repeat_n`
do
python3 bin/irrp.py -p -g17 -f data/pigpio.json "$name"
sleep 1s
done
●hubotにコマンド登録
sudo systemctl stop homebot
bin/hubot
homebot>homebot command pi:repeat bin/pi-repeat.sh '#'
set !pi:learn to bin/pi-repeat.sh '#'
#Ctrl+dでhubot終了
sudo systemctl start homebot
●動作確認
Slackで以下のテキストをhomebotに投稿
send pi:repeat(tvskip,5)
●IFTTTにアプレット追加
Make your own Applets from scratch横の+ボタンをタップ
→ This横の+をタップ
→ googleと検索 → Google Assistantを選択
→ Say a phrase with a numberを選択
→ What do you want to say?に「ビデオスキップ # 回」と入力
LanguageをJapaneseに → Create trigger
→ That横の+をタップ
→ slackと検索 → Slackを選択
→ Post to channelを選択
→ Which channel?をDirect Messages @homebot
Messageに「send pi:repeat(tvskip,NumberField)」と入力 → Create action
→ Finishをタップ