RaspberryPiとdiscord.pyで簡単おうちハック入門

# 00 はじめに
[アドカレ記事](https://qiita.com/Daruo/items/863fe92c37c6428b692b)の続きです。
**RaspberryPi**+**discord.py**で何かできないかなーと思ってやってみました。
前に作ったラズパイBlynkリモコンがラズパイ側の不調(おそらくSDカード)でお亡くなりになったのでこれを機にやろうかなと。

# 01 準備するもの
基本的なパーツは[秋月電商](http://akizukidenshi.com/catalog/top.aspx)で揃います。
(はんだこてやブレッドボード、ジャンパーワイヤーはある前提で進めています)

|品目|値段(円)|
|:--|:--|
|[RaspberryPiZeroW(単体)](https://raspberry-pi.ksyic.com/)|1,320|
|[赤外線リモコン受信モジュールＯＳＲＢ３８Ｃ９ＡＡ（２個入）](http://akizukidenshi.com/catalog/g/gI-04659/)|100|
|[赤外線ＬＥＤ ＯＳＩ５ＦＵ５１１１Ｃ－４０（５個入）](http://akizukidenshi.com/catalog/g/gI-03261/)|100|
|[カーボン抵抗（炭素皮膜抵抗）　１／４Ｗ１ｋΩ　（１００本入）](http://akizukidenshi.com/catalog/g/gR-25102/)|100|
|[カーボン抵抗（炭素皮膜抵抗）　１／４Ｗ10Ω　（１００本入）](http://akizukidenshi.com/catalog/g/gR-25100/)|100|
|[トランジスタ　２ＳＣ２１２０－Ｙ　（２０個入）](http://akizukidenshi.com/catalog/g/gI-13829/)|110|
|[**根気**](https://kotobank.jp/word/%E6%A0%B9%E6%B0%97-505869)|時価|

# 02 リモコンの赤外線を学習させる

まずは赤外線を受信するために、受信モジュールをこの表のように繋ぎます。

|RaspberryPi側|モジュール側(受信部分が自分に向いている状態)|
|:------------:|:-------------------------------------:|
|input用GPIO|左|
|GND|中央|
|3.3V|右|

赤外線のやりとりに関してはLircをしようとしたのですが、自分の部屋の環境が悪く、うまく設定できなかったので、WiringPiを用います。

こちらの記事が参考になりました。
[Raspberry PiのGPIOを利用して赤外線リモコンの信号をスキャン・送信](https://qiita.com/Hiroki_Kawakami/items/3f7d332797d188dc9022)

# 03 赤外線送信モジュールを作る
<img width="615" alt="スクリーンショット 2020-06-12 2.38.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450615/562d87b3-f189-a0fb-27af-2f9b99483756.png">
以上の様に作りました。
送信用GPIOピンは**PWMに対応したピン番号**を選んでください。

# 04 discord.pyで実行させる

シェルスクリプトで間接的に実行させるようにすると、メンテが楽です。
python側からの実行は**subprocess**を使います。

```python:index.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import discord
from discord.ext import commands
import subprocess
from subprocess import PIPE

# DiscordToken
TOKEN = 'Your Token'

# 接続に必要なオブジェクトを生成
client = discord.Client()

# 起動時に動作する処理
@client.event
async def on_ready():
    # 起動したらターミナルにログイン通知が表示される
    print('ready...')

# メッセージ受信時に動作する処理
@client.event
async def on_message(message):
    # メッセージ送信者がBotだった場合は無視する
    if message.author.bot:
        return

    # 照明スイッチ
    if message.content == 'on light':
        # ユーザ選別
        if (str)(message.author) == me_id:
            # ONコマンド
            subprocess.run("[ABSOLUTE PATH]/lightOn.sh",shell=True, text=True)
            await message.channel.send('照明をONにセットしました'+rasp)
        else: # 自分以外のユーザーが操作しようとした時
            await message.channel.send(f'{message.author.mention} 命令権がありません')

# Botの起動とDiscordサーバーへの接続
client.run(TOKEN)
```

# 05 systemctlで常駐化させる

`/etc/systemd/system/`下に、

```:discordBot.service
[Unit]
Description=Discord Bot Service

[Service]
ExecStart=pythonファイルの絶対パス
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target
```

を保存して、

```bash
raspberryPi$ sudo systemctl enable discordBot.service # 有効化
raspberryPi$ sudo systemctl start discordBot.service # 開始
```
を実行します。

これでbotの常駐化ができました。

## エラーが起きた場合・botが起動しない場合

ターミナルで

```bash
raspberryPi$ sudo systemctl status discordBot.service
```
を実行するとログの確認ができるのでエラーの対処をしましょう。


# 06 結果

うまくいくと、Discordのトーク画面から指定したコマンドで部屋の照明を制御できます。
他にエアコンなども設定しました。
また、Bot名は好きなキャラクター名をもじりました。

<img width="294" alt="スクリーンショット 2020-06-12 1.28.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450615/1b7b3fd0-cf72-e9f4-80b2-7c29550181d4.png">

とても良い。（良い）

一応ソースコードは[こちら](https://github.com/KINGVOXY/iotbot)(githubに飛びます)

discord.pyは便利なフレームワークがあるらしいのでそれを使いたかったのですが、前に似た様なbotのソースコードがあったので流用しました。

# 07 参考リンク
[Raspberry PiのGPIOを利用して赤外線リモコンの信号をスキャン・送信](https://qiita.com/Hiroki_Kawakami/items/3f7d332797d188dc9022)
[schemeit](https://www.digikey.jp/schemeit/)
[discord.py Document](https://discordpy.readthedocs.io/en/latest/intro.html)
[TVアニメ アイドルマスター公式](https://www.idolmaster-anime.jp/tv/)