Help us understand the problem. What is going on with this article?

RaspberryPi 3 Model B+ でlircを使ってリモコン化する(その2)

More than 1 year has passed since last update.

前回からのつづき

RaspberryPi 3 Model B+ でlircを使ってリモコン化する(その1)

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

今回やること

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

下準備

SlackでIncomingWebHookの有効化

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

ここで、投稿するチャンネル(制御するためのチャンネル)を選択し、Webhook URLを取得します。
image.png

ここで取得したWebhook URLをコピペします。また、ここで取得したアドレスを用いて制御を行っていきます。
image.png

ここでは、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'

image.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;
}
?>
/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アドレスにアクセスし、ボタンを押すことにより、制御することができると思います。

no4
みんなのしあわせのためにソフトウェアをつくる会社です🍀
https://no4.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away