Orange Pi ZeroでSlack送信の定点カメラを作ってみた

会社の部活で`Orange Pi Zero`を買ってもらったので、USBカメラと繋げて遊んでみました。

## Orange Piとは
[![image](https://qiita-image-store.s3.amazonaws.com/0/7132/6d165472-b705-1c0c-8656-cc7ef301e351.png)](http://amzn.to/2nCjqOW)

`Orange Pi`は`Raspberry Pi`に似た感じでLinuxが動かせる小型コンピューターです。
[![image](https://qiita-image-store.s3.amazonaws.com/0/7132/b9b03db8-f176-e8a5-e889-069ddefaaed6.png)](http://amzn.to/2nCjqOW)
USB・LANケーブル差せたる、WiFiとか付いてる、約800円で送料込みで1000円ちょっと、安い。

中では`armbian`というDebian系のOSが動いている状態です。

## USBカメラ
転がってたELECOMのカメラを使います。

[![image](https://qiita-image-store.s3.amazonaws.com/0/7132/3c1fbf30-8811-c888-48b5-032a38c122ee.png)](http://amzn.to/2nCfU7o)

## WebカメラをOrange Piで使う
### USB接続を確認
USBカメラをOrange Piに接続する。

```bash
$ lsusb
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 056e:7016 Elecom Co., Ltd 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

Elecomってやつがいるので、認識されてるみたい
```
Bus 002 Device 002: ID 056e:7016 Elecom Co., Ltd 
```

### fswebcamをインストール
とりあえずお手軽に撮影できるので`fswebcam`をインストールします

```bash
$ apt install -y fswebcam
```

### fswebcamで撮影してみる
```bash
$ fswebcam test.jpg
$ ls -l test.jpg 
-rw-r--r-- 1 root root 65560 Mar 26 19:29 test.jpg
```

![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/7132/134947dc-86dd-181e-9670-7d16d3329bb1.jpeg)

armbianにはGUIが付いてないため、
画像の確認にはCyberDuckからSFTP経由でダウンロードすると簡単に見られるので便利です


## 撮影した画像をSlackに送信
### pipインストール
```bash
$ python --version
Python 2.7.9

$ curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python
$ pip --version
pip 9.0.1 from /usr/local/lib/python2.7/dist-packages (python 2.7)
```

### fabricインストール

```bash
$ apt install -y build-essential libssl-dev libffi-dev python-dev
$ pip install fabric
$ fab --version
Fabric 1.13.1
Paramiko 2.1.2
```

### fabric経由で撮影

```py:~/fabfile.py
from datetime import datetime
from fabric.api import local

def camera():
  d = datetime.now().strftime("%Y-%m-%d_%H-%M")
  filename = 'camera_' + d + '.jpg'
  local('fswebcam --no-banner --frame 5 --set 5 --resolution 640x512 ' + filename)
```

```bash
$ fab camera
```

### slackに送信する

```bash
$ pip install slacker
```

```py:~/fabfile.py
from datetime import datetime
from fabric.api import local
from slacker import Slacker

SLACK_TOKEN = 'xxxxxxxxxxxxxxxxxxxxx'
SLACK_CHANNEL = 'xxxxx'

def camera():
  d = datetime.now().strftime("%Y-%m-%d_%H-%M")
  filename = 'camera_' + d + '.jpg'
  local('fswebcam --no-banner --frame 10 --set 5 --resolution 640x512 ' + filename)

  slack = Slacker(SLACK_TOKEN)
  slack.files.upload(filename, channels=[SLACK_CHANNEL])
```

`SLACK_TOKEN`と`SLACK_CHANNEL`にはSlackから取得したものを設定してください

うまくいくとこんな感じで投稿されます
<img width="474" alt="スクリーンショット 2017-03-27 4.36.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/7132/45f652c3-9de0-4992-61fa-56a5e9eb5d43.png">

### cronに登録して定期実行

```bash
$ crontab -e
```

```text:crontab
* * * * * /usr/local/bin/fab camera >>/tmp/cron.log 2>>/tmp/cron-err.log
```

これで毎分撮影されるようになります

## GIFアニメを作成してSlackに投稿する
毎分投稿されるとうざいのでGIFアニメにして10分毎にまとめて投稿されるようにしてみます。

### ImageMagicをインストール
```bash
$ apt install -y imagemagick
$ convert -version
Version: ImageMagick 6.8.9-9 Q16 arm 2017-03-12 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules OpenMP
Delegates: bzlib cairo djvu fftw fontconfig freetype jbig jng jpeg lcms lqr ltdl lzma openexr pangocairo png rsvg tiff wmf x xml zlib
```

### GIFアニ作成task作成
fabfileを少し修正して、GIFアニを作ってSlack投稿するtaskを新しく作ります

```py:~/fabfile.py
from datetime import datetime
from fabric.api import local
from slacker import Slacker

SLACK_TOKEN = 'xxxxxxxxxxxxxxxxxxxxx'
SLACK_CHANNEL = 'xxxxx'

def camera():
  d = datetime.now().strftime("%Y-%m-%d_%H-%M")
  filename = 'camera_' + d + '.jpg'
  local('fswebcam --no-banner --frame 10 --set 5 --resolution 640x512 ' + filename)

def slack():
  filename = 'anime.gif'
  local('convert -delay 10 -loop 0 camera_*.jpg ' + filename)

  slack = Slacker(SLACK_TOKEN)
  slack.files.upload(filename, channels=[SLACK_CHANNEL])

  local('rm camera_*.jpg')
```

### cronで10分毎に実行させるように登録

```text:crontab
* * * * * /usr/local/bin/fab camera >>/tmp/cron.log 2>>/tmp/cron-err.log
*/10 * * * * /usr/local/bin/fab send >>/tmp/cron.log 2>>/tmp/cron-err.log
```

そしてできあがったのがこれ
![test.gif](https://qiita-image-store.s3.amazonaws.com/0/7132/198e1f9e-10ce-ca35-b670-0896c49c0b28.gif)


## おわり
今回`Orange Pi`を初めて使ってみましたが、普通に`Raspberry Pi`を同じように使えた
`Raspberry Pi Zero W`も発売されましたが、全く手に入らないので代用に`Orange Pi Zero`けっこう良いかもしれない

日本ではこのWiFi使うと技適警察に怒られるので注意！
fabric使ったけど、今回いらなかった気がする・・・