さくらのIoT

「さくらのIoT」のエンジニアが取り組んでいる事例をご紹介します。電池で動作する低消費電力の水位計測機を作成しました。前回からの続きでサーバー設定からグラフ表示の内容を説明します。(前回の内容は「電池で動作するLTE通信方式の水位測定器の作成と運用(1)」からご覧ください。)

さくらのクラウドで作成したクラウドサーバーでGrafanaを使った水位計測値のグラフ化サービスを作成します。水位計から送信されたデータは、クラウドサーバー上のNode-REDというローコードツールで文字列の分離や数値計算といった処理を行い、InfluxDBという時系列データベースに格納されます。GrafanaはInfluxDBから記録された水位などの情報を読み取ってWeb画面上に描画します。また、水位計のLTE通信に使うSIMをセキュアモバイルコネクトのコントロールパネルに登録して、クラウドサーバーと通信する仕組みを構築します。

設置した水位計の情報を統合してグラフ化した運用例です。水位の履歴や各河川の現在の状況を確認しやすいように構築しています。

LTE通信のステータス情報を一覧にすることで、装置の状態を監視することもできます。時間帯によって電波状況が変わる様や、気温による水位への影響などの傾向も見て取れます。

サーバー設定

概要

図のような構成でサーバーを用意します。Node-REDとInfluxDBとGrafanaが動作するクラウドサーバーと、SIMが登録されたモバイルゲートウェイ(MGW)をスイッチで接続します。水位計はクラウドサーバーとのみ通信できるように設定しておきます。インターネットへの出入り口はクラウドサーバーに限定します。

内部IPアドレス
クラウドサーバー:192.168.1.2
モバイルゲートウェイ(MGW):192.168.1.3
水位計用SIM:192.168.1.10 ~

MGWの作成

さくらのクラウドから、セキュアモバイルコネクトのサービスでモバイルゲートウェイ(MGW)を作成します。モバイルゲートウェイはセキュアモバイルコネクトのSIM管理する仕組みで、1万枚までのSIMを登録することができます。

SIMの登録

セキュアモバイルコネクトのSIMを登録します。SIMのICCIDとパスコードが必要になります。登録したSIMは前項で作成したMGWに紐づけます。

CentOS7のファイアウォールの設定

ファイアウォールに通信で使用するポートを設定します。

  • モバイルケートウェイからクラウドサーバーの通信
    internal 1234/udp
  • Node-RED、GrafanaからInfluxDBの通信
    public 8086/tcp
  • Grafanaからインターネットの通信
    public 80/tcp (HTTP)
    public 25/tcp (メール)

モバイルゲートウェイからクラウドサーバーの通信はUDPで、1234番ポートを使います。

  • NICのeth1をinternalゾーンに設定
    [root@localhost /]# firewall-cmd --permanent --zone=internal --add-interface=eth1
  • 1234番開放
    [root@localhost /]# firewall-cmd --zone=internal --add-port=1234/udp --permanent
  • 1234番閉鎖
    [root@localhost /]# firewall-cmd --zone=internal --remove-port=1234/udp --permanent
  • 設定反映:[root@localhost /]# firewall-cmd --reload
  • 設定値一覧表示:[root@localhost /]# firewall-cmd --list-all-zones

クラウドサーバーのIPアドレスを設定

クラウドサーバーからスイッチに接続するため、コンパネ上でNICにデバイスを追加します。追加されたデバイス(eth1)にIPの設定を行います。

  • NICの状態確認:[root@localhost /]# nmcli device

eth1を追加:
[root@localhost /]# nmcli connection add type ethernet ifname eth1 con-name eth1

固定IPで設定:
[root@localhost /]# nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.1.2/24
ネットワークリスタート:
[root@localhost /]# systemctl restart network.service

InfluxDBの設定

計測値を記録するデータベースを準備します。

インストール作業

[root@localhost ~]# cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
[root@localhost /]# sudo yum install influxdb
[root@localhost /]# sudo systemctl start influxdb
[root@localhost /]# sudo systemctl enable influxdb
[root@localhost /]# sudo firewall-cmd —add-port=8086/tcp —zone=internal —permanent
[root@localhost /]# sudo firewall-cmd —reload

パスワード設定

パスワードを設定するためログインします。ログアウトするときはexitです。

[root@test-ishikari ~]# influx
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
>

次のコマンドでユーザー名とパスワードを設定します。オプションの "-precision rfc3339"は時間表記をUNIX時間から日時形式に変更する設定です。

> CREATE USER 'ユーザー名' WITH PASSWORD 'パスワード' WITH ALL PRIVILEGES -precision rfc3339

次回以降はユーザー名とパスワードを入れてログインします。

[root@localhost /]# influx -username ユーザー名 -password パスワード -precision rfc3339

データベース作成

> CREATE DATABASE TEST
> show databases
name: databases
name
——
_internal
TEST
> use TEST
Using database TEST

データベース表示

> select * from TEST
name: TEST
time CO2 HUMI LUMI TEMP TIME
—— — —— —— —— ——
1667288330332912197 614 49.132526 5.3157897 21.92378 2022-11-01T07:38:50.319Z
1667288390060085404 612 49.18288 5.5789475 21.899748 2022-11-01T07:39:50.037Z
1667288450011502231 617 49.169147 5.368421 21.897078 2022-11-01T07:40:49.987Z
1667288510203899195 619 49.14626 5.5789475 21.902418 2022-11-01T07:41:50.187Z
1667288570057071532 620 49.0959 5.4210525 21.934462 2022-11-01T07:42:50.039Z

データベースの一部削除

特定時刻範囲のレコードを削除する例。SELECTでよく確かめてからDELETEするようにします。

> SELECT Distance FROM TEST WHERE (time >= ‘2023-01-26T09:47:33.511188456+09:00’ AND time <= ‘2023-01-31T16:57:37.659122948+09:00’)
name: TEST
time Distance
—— ————
2023-01-31T09:47:33.511188456+09:00 1926
2023-01-31T09:49:35.607574787+09:00 1928
2023-01-31T09:51:37.659122948+09:00 1929

> DELETE FROM TEST WHERE (time >= ‘2023-01-31T09:47:33.511188456+09:00’ AND time <= ‘2023-01-31T09:51:37.659122948+09:00’)

HTTP認証有効化

GrafanaからInfluxDBのアクセスするためにHTTP認証を有効化します。

[root@localhost /]# vi /etc/influxdb/influxdb.conf
# Determines whether user authentication is enabled over HTTP/HTTPS.
# auth-enabled = false

↓書き換え

# Determines whether user authentication is enabled over HTTP/HTTPS.
auth-enabled = true

プロセス再起動

[root@localhost /]# sudo systemctl stop influxdb
[root@localhost /]# sudo systemctl start influxdb

Grafanaの設定

DBに格納したデータをグラフ化する仕組みです。GUIで設定するだけで、きれいなWebページを作成できます。

インストール作業

[root@localhost /]# cat <<EOF | sudo tee /etc/yum.repos.d/grafana.repo
[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
EOF
[root@localhost /]# yum update
[root@localhost /]# yum install grafana
[root@localhost /]# systemctl daemon-reload
[root@localhost /]# systemctl start grafana-server
[root@localhost /]# systemctl status grafana-server
[root@localhost /]# systemctl enable grafana-server.service

ポート番号設定

Webブラウザからポート番号を指定せずにアクセスするため、デフォルト値3000番から80番に変更します。
参考ページ
https://grafana.com/docs/grafana/latest/setup-grafana/start-restart-grafana/
https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/

このコマンドで設定ファイルを開く

[root@localhost /]# systemctl edit grafana-server.service

追記内容

[Service]
# Give the CAP_NET_BIND_SERVICE capability
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE

# A private user cannot have process capabilities on the host's user
# namespace and thus CAP_NET_BIND_SERVICE has no effect.
PrivateUsers=false

次のコマンドを実行

[root@localhost /]# sudo setcap 'cap_net_bind_service=+ep' /usr/sbin/grafana-server

iniファイルを編集

[root@localhost /]# vi /etc/grafana/grafana.ini

# The http port to use
;http_port = 80
下記の内容変更に変更
http_port = 80

CentOS7のPostfixメールサーバー設定

Grafanaからアラートメールを送信するためのメールアカウントを作成します。他に使えるメールアカウントがある場合は作成は不要です。

ユーザー作成

[root@localhost /]# useradd ユーザー名

パスワード設定

[root@localhost /]# passwd ユーザー名

アカウント設定

[root@localhost /]# echo 'パスワード' | saslpasswd2 -p -u localhost.com -c ユーザー名

Grafanaにアラート用メールアカウントを設定

Iniファイルを編集する

[root@localhost /]# vi /etc/grafana/grafana.ini

#################################### SMTP / Emailing ##########################
[smtp]
;enabled = false
;host = localhost:25
;user =
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
;password =

下記の内容に変更
※パスワードをダブルクォーテーション””で括るのを忘れないように注意

[smtp]
enabled = true
Host = SMTPメールサーバーーアドレス:ポート番号 (クラウドサーバーのpostfixを使うときはlocalhost:25のままで良い。
User = ユーザー名
# If the password contains # or ; you have to wrap it with triple quotes. Ex “””#password;”””
Password = “パスワード”

設定後は再起動する

[root@localhost /]# sudo systemctl restart grafana-server
[root@localhost /]# sudo service grafana-server restart

メールのロゴとフッターの変更

参考情報:https://sbcode.net/grafana/email-alert-template/
ロゴとフッターを変更できる。
変更前

変更後

編集ファイル
vi /usr/share/grafana/public/emails/ng_alert_notification.html

変更前:<img class=“logo” src=“https://grafana.com/assets/img/logo_new_transparent_200x48.png” style=“width: 200px; display: inline; outline: none !important; text-decoration: none !important; -ms-interpolation-mode: bicubic; clear: both; border-width: 0;” align=“none” />
変更後:<img class=“logo” src=“https://www.sakura.ad.jp/resource/images/header_logo_bgwhite.png” style=“width: 400px; display: inline; outline: none !important; text-decoration: none !important; -ms-interpolation-mode: bicubic; clear: both; border-width: 0;” align=“none” />
変更前:<br />© 2022 Grafana Labs
変更後:<br />© 2023 SAKURA internet Inc.

Data Sources設定

InfluxDBのログイン情報を入力します。

グラフの作成

InfluxDBにデータが格納されていてデータソースの設定が正しく行われていた場合は、クエリ作成ウィンドウのselect measurementをクリックすると、データベース名が選択できます。

次に、field(value)をクリックすると記録されているデータベースの列を選択できるはずです。

水位計は計測値の他にICCIDを送信しています。今回はICCIDをユニーク番号として機体の識別に使用しています。クエリでICCIDをWHEREに指定して個別の水位計の数値を取得します。また、この段階で移動平均などの関数を適用することもできます。

アラートの作成

グラフの描画で扱うクエリ文でアラートを設定することができます。水位計測値が警戒水位の範囲に入ったとき、アラートメールを送信する仕組みです。この画像は、最後の計測値が指定範囲に10分以上入っていた場合にアラートを上げるという設定例です。

Node-REDの設計

水位計-モバイルゲートウェイから送られてきたデータをNode-REDで受けて、各種処理を行ってからInfluxDBに格納します。測定値の平均化や外れ値の排除など、ほとんどの計算は【数値計算とデータベース格納データ作成】のファンクションで処理しています。
次のフローで処理します。

  • 水位計が送信したデータをUDPで受信
  • UDPで受信した文字列をカンマ区切りで分割
  • 文字列から数値に変換、水位の処理、LTE通信パラメータの処理
  • InfluxDBに格納

水位の計算方法

  • 超音波センサーの値をエラー処理(300もしくは500mm以下、-1のエラー値は計算から除外)
  • 5つの値から中央値を求めて、中央値から60mm以上離れた値は計算から除外
  • 残った値から平均値を求める
  • 水位計から川底までの距離から超音波センサーの計測値を引いたものが水位

githubのNode-REDのフォルダにノード設定ファイルを公開しています。

設置と運用

石狩市と連携して、過去氾濫を経験した河川などを優先的に設置しています。また弊社は石狩市とIoT技術を軸とした防災や地域活性化に向けての包括協定を結び取り組んでいます。過去に発生した北海道胆振東部地震のときに大停電になった際、LPWAの取り組みから見えてきたモノのデータの有用性について記載してますので御覧ください。

まとめ

今回の機器の置き換えによって、電池動作寿命が大幅に延び、電池交換頻度が1年に1回から5年に1回と大幅に低減されました。これはIoT機器を商用サービスに組み込んだ場合、運用コストを大幅に低減できることを意味しています。セキュアモバイルコネクトを利用したことで設置箇所の電波状況に応じた都合の良い通信キャリアを選択できたことや、閉域網でセキュリティを意識せずに構築できることがメリットだと感じました。今後もさくらインターネットは石狩市と連携してIoT技術を生かした地域活性化に協力していきます。

構成・執筆・編集
IoTプラットフォーム事業部

IoTコラムでは、さくらのIoTに関係するビジネス向けの内容や身近な例、通信技術の説明や当社エンジニアが取り組んだ開発サンプルなどを掲載しています。

2023年5月公開