RaspberryPi 3 Model B+ でlircを使ってリモコン化する（その２）

## 前回からのつづき

[RaspberryPi 3 Model B+ でlircを使ってリモコン化する（その１）](https://qiita.com/nomunomu/items/8f47d97766c69a6bd6b1)

さて、前回のつづきで、ラズパイをスマホやPCから制御したいと思います。

## 今回やること
今回は「Slack」とラズパイを連携させて、Slackを介して制御させます

## 下準備
### SlackでIncomingWebHookの有効化

以下のアドレスから、IncomingWebHooksを有効化します
[https://my.slack.com/services/new/incoming-webhook/]

ここで、投稿するチャンネル（制御するためのチャンネル）を選択し、Webhook URLを取得します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/110131/497263ab-5eda-39e5-0239-1d2f68b8ddb0.png)

ここで取得したWebhook URLをコピペします。また、ここで取得したアドレスを用いて制御を行っていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/110131/525c6795-9926-edba-5ef4-67de5cb7cb3c.png)

ここでは、Slackへ投稿するIncomingWebHookの表示名、アイコンなどはカスタマイズ可能です。これは各個人で変更することができます。

### apache2, php5のインストール
```shell-session
$ sudo apt-get install apache2 php5
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  apache2-bin apache2-data apache2-utils libapache2-mod-php5 libapr1 libaprutil1 libaprutil1-dbd-sqlite3
  libaprutil1-ldap liblua5.1-0 libonig2 libperl4-corelibs-perl libqdbm14 lsof php5-cli php5-common php5-json
  php5-readline
Suggested packages:
  apache2-doc apache2-suexec-pristine apache2-suexec-custom php-pear php5-user-cache
The following NEW packages will be installed:
  apache2 apache2-bin apache2-data apache2-utils libapache2-mod-php5 libapr1 libaprutil1 libaprutil1-dbd-sqlite3
  libaprutil1-ldap liblua5.1-0 libonig2 libperl4-corelibs-perl libqdbm14 lsof php5 php5-cli php5-common php5-json
  php5-readline
0 upgraded, 19 newly installed, 0 to remove and 81 not upgraded.
Need to get 6,829 kB of archives.
After this operation, 24.3 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
```

Slackからラズパイにアクセスされる際に、apacheがないとhttp経由でアクセスすることができません。

また、ラズパイと異なるネットワークからアクセスるる場合は、Internet側のIPアドレスに80ポートでアクセスしたとき、ラズパイのIPアドレスにポートフォワードしてあげるように設定してください。

さらには、www-dataではrootの権限がないので、www-dataにroot権限を与えます。

今回はすべてローカルネットワークでの完結です。

```shell-session
$ nano /etc/sudoers

# 以下をファイルの一番下に追記してください
www-data ALL=(root) NOPASSWD: ALL
```

## Slackwebのセットアップ
### Slackwebのインストール

```shell-session
$ sudo pip install slackweb
Downloading/unpacking slackweb
  Downloading slackweb-1.0.5.tar.gz
  Running setup.py (path:/tmp/pip-build-ZtOu3c/slackweb/setup.py) egg_info for package slackweb
    
Installing collected packages: slackweb
  Running setup.py install for slackweb
    
Successfully installed slackweb
Cleaning up...
```

### 投稿テスト
とりあえずパッケージが入ったので投稿テストしてみます。ここではiPythonを使います。

```shell-session
$ ipython
Python 2.7.9 (default, Sep 17 2016, 20:26:04) 
Type "copyright", "credits" or "license" for more information.

IPython 2.3.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import slackweb

In [2]: slack_url = "https://hooks.slack.com/services/xxx/xxx/xxxxx"

In [3]: slack = slackweb.Slack(url=slack_url)

In [4]: slack.notify(text="Hello World!! From iPython")
Out[4]: u'ok'
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/110131/5d1384d8-66eb-663c-3c96-32f95c86a6b6.png)


このようにSlackに投稿されていればOKです。

## 実際に動かす
### webページを作る
ここでは簡単なボタンが設置されてるだけのwebページを作ります。ボタンが押されたらphpから`irsend`コマンドを実行し、その後pythonを呼び出しSlackにメッセージを投げます。

```/var/www/html/ajax.php
<?php
if (isset($_POST['action'])) {
        exe($_POST['action']);
}
function exe($selector) {
        exec('irsend SEND_ONCE fctv_controller ' . $selector);
        exec('python /var/www/slack.py '. $selector . "を実行したよ");
        exit;
}
?>
```

```html:/var/www/html/index.php 
<html>
<head>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  <script>
    $(document).ready(function(){
      $('.button').click(function(){
          var clickBtnValue = $(this).val();
          var ajaxurl = 'ajax.php',
          data =  {'action': clickBtnValue};
          $.post(ajaxurl, data)
                .done( function (response) {
                        // Response div goes here.
                        // alert(response);
                });
      });

    });
  </script>
</head>
<body>
  <input type="submit" class="button" name="tv_power" value="tv_power" />
</body>
</html>
```

```/var/www/slack.py
import sys, slackweb
argvs = sys.argv

SLACK_URL = "https://hooks.slack.com/services/xx/xx/xxxx"

slack = slackweb.Slack(url=SLACK_URL)
slack.notify(text=argvs[1])
```

```sh:/var/www/ir.sh
irsend SEND_ONCE XXXXXXXX xxxxxxxx
```

それぞれをそれぞれのファイルに書き込み、作成します。そして、ラズパイのIPアドレスにアクセスし、ボタンを押すことにより、制御することができると思います。