脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

raspberryPiにinfluxdbとgrafanaをインストールする

ラズベリーパイにinfluxdbをインストールして、データをgrafanaでvisualization化する方法です。

Install influxdb

1. install influxdb

$ wget http://ftp.us.debian.org/debian/pool/main/i/influxdb/influxdb_1.0.2+dfsg1-1_armhf.deb
$ sudo dpkg -i influxdb_1.0.2+dfsg1-1_armhf.deb
  Selecting previously unselected package influxdb.
  (Reading database ... 133808 files and directories currently installed.)
  Preparing to unpack influxdb_1.0.2+dfsg1-1_armhf.deb ...
  Unpacking influxdb (1.0.2+dfsg1-1) ...
  Setting up influxdb (1.0.2+dfsg1-1) ...
  Adding system user 'influxdb' (UID 113) ...
  Adding new user 'influxdb' (UID 113) with group 'nogroup' ...
  Not creating home directory '/var/lib/influxdb'.
  Adding group 'influxdb' (GID 120) ...
  Done.
  Adding user 'influxdb' to group 'influxdb' ...
  Adding user influxdb to group influxdb
  Done.
  Processing triggers for systemd (215-17+deb8u4) ...
  Processing triggers for man-db (2.7.0.2-5) ...

$ ps aux | grep influx
  influxdb  1442  0.5  3.1 897392 27904 ?        Ssl  10:33   1:18 /usr/bin/influxd -config /etc/influxdb/influxdb.conf
  pi        6804  0.0  0.2   4276  1908 pts/1    S+   14:17   0:00 grep influx
$ ss -lntp | grep 808
  LISTEN     0      128                      :::8083                    :::*
  LISTEN     0      128                      :::8086                    :::*
  LISTEN     0      128                      :::8088                    :::*

(※v1.2のinstall方法も書きました)
portaltan.hatenablog.com

2. confirm GUI

GUIのportは8083なので、「http://{raspberryPiのIP}:8083」にアクセスして、以下のようなGUI画面が出てくることを確認
f:id:portaltan:20170203142048p:plain

「SHOW DATABASES」と打ち込み、きちんとクエリも投げられることを確認
f:id:portaltan:20170203142203p:plain

3. confirm API

pingチェック
$ curl -sl -I  http://localhost:8086/ping
  HTTP/1.1 204 No Content
  Content-Type: application/json
  Request-Id: 9460e8cc-e9d2-11e6-8047-000000000000
  X-Influxdb-Version: 1.0.2
  Date: Fri, 03 Feb 2017 05:35:32 GMT
  • 204ならOK
クエリチェック

APIのportは8086なので、以下のようにAPI経由でも同じようにdatabaseが確認できるかチェック

$ curl http://localhost:8086/query --data-urlencode "q=SHOW DATABASES"
{"results":[{"series":[{"name":"databases","columns":["name"],"values":[["_internal"]]]}]}]}

influxdb APIの使い方

DATABASEの作成

$ curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE ${作成したいdatabase名}"
  • endpointは/query

データ投入

method
$ curl -i -XPOST "http://localhost:8086/write?db=${データ投入したいdatabase名}" --data-binary '${measurement名} ${Field名(column名)}=${値}'
  • endpointは/write
確認
$ curl -i -XPOST "http://localhost:8086/write?db=mydb" --data-binary 'test_measurement value=100'
$ curl -i -XPOST "http://localhost:8086/write?db=mydb" --data-binary 'test_measurement value=200'
$ curl -i -XPOST "http://localhost:8086/write?db=mydb" --data-binary 'test_measurement value2=200'

$ curl -G 'http://localhost:8086/query?db=mydb&pretty=true' --data-urlencode 'q=SELECT * FROM test_measurement'
{
    "results": [
        {
            "series": [
                {
                    "name": "test_measurement",
                    "columns": [
                        "time",
                        "value",
                        "value2"
                    ],
                    "values": [
                        [
                            "2017-02-03T05:45:22.049368887Z",
                            100,
                            null
                        ],
                        [
                            "2017-02-03T05:45:31.98145523Z",
                            200,
                            null
                        ],
                        [
                            "2017-02-03T05:49:57.29042142Z",
                            null,
                            200
                        ]
                    ]
                }
            ]
        }
    ]
}

ちなみに自分の中ではinfluxdbの各項目はこんなイメージです

influxdb mysql
database database
measurement table
field column

install grafana

1. install grafana

### install grafana-data
$ wget http://ftp.us.debian.org/debian/pool/main/g/grafana/grafana-data_2.6.0+dfsg-3_all.deb
$ sudo dpkg -i grafana-data_2.6.0+dfsg-3_all.deb
$ sudo apt-get install -f

### install grafana
$ wget http://ftp.us.debian.org/debian/pool/main/g/grafana/grafana_2.6.0+dfsg-3_armhf.deb
$ sudo dpkg -i grafana_2.6.0+dfsg-3_armhf.deb
$ sudo apt-get install -f

$ ps aux | grep grafana
  grafana   5525  0.0  1.5 884972 13804 ?        Ssl  10:54   0:07 /usr/sbin/grafana --config=/etc/grafana/grafana.ini cfg:default.paths.logs=/var/log/grafana cfg:default.paths.data=/var/lib/grafana
  pi        7006  0.0  0.2   4276  1908 pts/1    S+   15:43   0:00 grep grafana

$ ss -lntp | grep 3000
LISTEN     0      128                      :::3000                    :::*

2. GUI確認

portは3000なので、「http://{raspberryPiのIP}:3000」にアクセスして、以下のようなGUI画面が出てくることを確認
f:id:portaltan:20170203155047p:plain

  • 初期アカウントはadmin/admin

ログインすると以下のような画面が表示される
f:id:portaltan:20170203155135p:plain

3. Dashboard作成

Data Sourceの設定

f:id:portaltan:20170203155501p:plain

  • Name: 好きな名前
  • Type: influxDB
  • Url: influxDBのAPI
  • Database: アクセスするdababase名
  • user/pasword: root/root

Dashboardの設定

Dashboard > New > Add Panel > Graphと選んでいくと、以下のようなグラフが表示される
f:id:portaltan:20170203160001p:plain

  • ちなみにこの段階で表示されているのはダミーデータ

data_sourceや取得したmeasurements情報を入力していくと以下のようにinfluxdb上のデータでグラフが作成されるf:id:portaltan:20170203160256p:plain

  • influxdbの項目でセットした100と200が表示されているのがわかる
  • grafanaの詳しい設定は以下参照

portaltan.hatenablog.com

気象庁の風向・風速の計測(計算)方法

瞬間風向・瞬間風速・最大瞬間風速

  • 瞬間風向:0.25秒毎の瞬間の風の向き
  • 瞬間風速:風速計の測定値(0.25秒間隔)を3秒間平均した値(測定値12個の平均値)
  • 最大瞬間風速:(任意の期間中の)瞬間風速の最大値

平均風向・平均風速・最大風速

  • 平均風向:10分間のデータの平均風向
    • ただし航空機の離着陸のための観測においては2分間で平均を出す
  • 平均風速:10分間のデータの平均風速
    • ただし航空機の離着陸のための観測においては2分間で平均を出す
  • 最大風速:(任意の期間中)平均風速の最大値

raspberryPi3(jessie)にopenCV3.1.0をインストールする

わりと手こずりましたが、ラズベリーパイにopencv3.1.0をインストールする方法です
以下のサイトを参考にさせて頂きました。

Procedure

ライブラリのインストール

$ sudo apt-get install build-essential cmake cmake-qt-gui
$ sudo apt-get install libgtk2.0-dev libjpeg-dev libtiff5-dev libjasper-dev libopenexr-dev python-dev python-numpy python-tk libeigen3-dev yasm libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common libv4l-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev default-jdk ant libvtk5-qt4-dev

packageのダウンロード

$ cd ~
$ mkdir src
$ cd src

# OpenCVのダウンロード
$ wget https://github.com/Itseez/opencv/archive/3.1.0.zip
$ unzip 3.1.0.zip

# OpenCV contribもダウンロード
$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
$ unzip opencv_contrib.zip

build

$ cd opencv-3.1.0
$ mkdir build
$ cd build

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=/home/pi/src/opencv_contrib-3.1.0/modules \
-D BUILD_EXAMPLES=ON ..

$ make -j4

install

$ sudo make install
$ sudo ldconfig

確認

$ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> print cv2.__version__
3.1.0

無事3.1.0がインストールされていることを確認して完了

openCVでraspberryPiのUSBカメラのキャプチャをとって、サイズを変更する

import cv2

# cameraの設定
c = cv2.VideoCapture(0)

# キャプチャ
boolean, img = c.read()
h, w = img.shape[:2]
print h # 1280
print w # 720

# サイズ変更
half = cv2.resize(img, (320, 240))
hh, hw = half.shape[:2]
print hh  # 320
print hw  # 240

cv2.imwrite('half.jpg', half)
  • VideoCaptureでdeviceを指定して、readでキャプチャをとる
  • resize(source, (heightのsize, widthのsize))でサイズ変更
  • imwriteでimageをファイル出力

うまく行かない場合はlsusbとかでちゃんとUSBカメラが認識されているか確認する

motionを使ってRaspberryPiからUSBカメラの映像をストリーミングする方法

motionのインストール

sudo apt-get install motion

設定の変更

sudo vi /etc/motion/motion.conf

 ### USBカメラの設定をする(解像度やFramerate)
 89 # Image width (pixels). Valid range: Camera dependent, default: 352
 90 width 320
 91
 92 # Image height (pixels). Valid range: Camera dependent, default: 288
 93 height 240
 94
 95 # Maximum number of frames to be captured per second.
 96 # Valid range: 2-100. Default: 100 (almost no limit).
 97 framerate 2

 ### 画像ファイルとして保存する機能は今回はoffにする
 250 output_pictures off

 ### Streamingの設定をする
 473 # Maximum framerate for stream streams (default: 1)
 474 stream_maxrate 2
 475
 476 # Restrict stream connections to localhost only (default: on)
 477 stream_localhost off

motion起動

sudo motion -n

確認

以下のURLにアクセスして映像が確認できれば完了

http://{raspberryPiのIP}:8081

ただしMJPG-stremerに比べて3秒前後の遅延が発生する。

USBカメラの解像度等の情報を確認する方法

deviceの確認

まずはカメラを接続したらlsusbで認識されているか確認します

$ lsusb
Bus 001 Device 005: ID 288c:0002  # <== これが追加された
Bus 001 Device 007: ID 05ac:0222 Apple, Inc. Aluminum Keyboard (JIS)
Bus 001 Device 006: ID 04ca:0061 Lite-On Technology Corp.
Bus 001 Device 004: ID 05ac:1006 Apple, Inc. Hub in Aluminum Keyboard
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

今回はBus 001 Device 005にUSBカメラが設定されています。
このときカメラの製造元や会社の名前が出てくるときと出てこない場合があります

各項目の確認

概要確認
$ v4l2-ctl -d 0 --info
Driver Info (not using libv4l2):
        Driver name   : uvcvideo
        Card type     : MS-M103HU
        Bus info      : usb-3f980000.usb-1.5
        Driver version: 4.4.11
        Capabilities  : 0x84200001
                Video Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps   : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format
全項目確認
$ v4l2-ctl -d 0 --all
Driver Info (not using libv4l2):
        Driver name   : uvcvideo
        Card type     : MS-M103HU
        Bus info      : usb-3f980000.usb-1.5
        Driver version: 4.4.11
        Capabilities  : 0x84200001
                Video Capture
                Streaming
                Extended Pix Format
・
・
・
対応解像度&FPS確認
$ v4l2-ctl -d 0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'YUYV'
        Name        : YUYV 4:2:2
                Size: Discrete 1280x720
                        Interval: Discrete 0.083s (12.000 fps)

        Index       : 1
        Type        : Video Capture
        Pixel Format: 'MJPG' (compressed)
        Name        : Motion-JPEG
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
lsusbでも確認できる
$ lsusb -s 001:005 -v | egrep "Width|Height"
Couldn't open device, some information will be missing
        wWidth                           1280
        wHeight                           720
        wWidth( 0)                       1280
        wHeight( 0)                       720
        wWidth                           1280
        wHeight                           720
        wWidth( 0)                       1280
        wHeight( 0)                       720

low voltage detected, date/time is not reliable.

エラー文

RaspberryPiでRTCから時刻合わせをしようとすると以下のようなエラーが出ることがある。

Jan 01 23:11:11 raspberrypi kernel: [  131.098038] rtc-pcf8563 1-0051: low voltage detected, date/time is not reliable. 

ちなみに使ったRTCはこちら
リアルタイムクロック(RTC)モジュール: 半導体 秋月電子通商 電子部品 ネット通販
f:id:portaltan:20170113194609j:plain
エラーの意味としては『電圧低下が検知されたよ。だから今の時刻データは信頼できないよ。』って感じの警告だ。

調査

アプリケーションノートを読んでみると、RTCへの電源供給の電圧が一定以下になった場合、VLflag(Voltage Low Flag)が立つらしい。
f:id:portaltan:20170113100032p:plain

対応

ちなみにこのVLフラグは秒数を管理しているメモリ区域で管理されている
f:id:portaltan:20170113100209p:plain

なので上記のエラー文を出したくなければ、VLフラグを0クリアしてやればエラーは出なくなる。