前回からのつづき
さて、前回のつづきで、ラズパイをスマホやPCから制御したいと思います。
今回やること
今回は「Slack」とラズパイを連携させて、Slackを介して制御させます
下準備
SlackでIncomingWebHookの有効化
以下のアドレスから、IncomingWebHocksを有効化します https://my.slack.com/services/new/incoming-webhook/
ここで、投稿するチャンネル(制御するためのチャンネル)を選択し、Webhook URLを取得します。
ここで取得したWebhook URLをコピペします。また、ここで取得したアドレスを用いて制御を行っていきます。
ここでは、Slackへ投稿するIncomingWebHookの表示名、アイコンなどはカスタマイズ可能です。これは各個人で変更することができます。
apache2, php5のインストール
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権限を与えます。
今回はすべてローカルネットワークでの完結です。
$ nano /etc/sudoers # 以下をファイルの一番下に追記してください www-data ALL=(root) NOPASSWD: ALL
Slackwebのセットアップ
Slackwebのインストール
$ 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を使います。
$ 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'
このように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; } ?> ######### /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]) ######### /var/www/ir.sh ######### irsend SEND_ONCE XXXXXXXX xxxxxxxx
それぞれをそれぞれのファイルに書き込み、作成します。そして、ラズパイのIPアドレスにアクセスし、ボタンを押すことにより、制御することができると思います。