IoT機器で温湿度を測定してクラウドでグラフ化 動作環境編(その7) | そう備忘録

IoT機器で温湿度を測定してクラウドでグラフ化 動作環境編(その7)

動作環境

RaspberryPi Zeroと温湿度モジュール(DHT22)を使用して温湿度を指定した間隔(分)で測定してクラウド(AWS IoT Core)にデータをアップロードしてグラフ化するまでの7回目。

過去記事は以下の通り。

今回の記事の範囲はラズパイゼロの動作環境の構築とする。

開発中はデスクトップでGUI操作でデバッグをしていたが本稼働させるのであれば不要なリソースの消費を抑えるためにもCLI(Command line interface)にしておきたい。

またラズパイゼロの電源をONにした時に自動的に温湿度測定のプログラムが起動する等、自動起動に関する記事とする。

システム概要図

システム概要図と今回の記事の範囲は以下の通り。

温湿度測定 記事7の範囲
  • 指定した間隔(分)で温湿度を測定する
  • 指定した間隔(分)でデータをサーバーにアップロードする
  • アップロードしたデータは集計、グラフ表示する
  • 温湿度のしきい値(上限、下限)を超えた場合はアラートを発信する
  • しきい値は場所毎に異なる値を指定出来るようにする
  • 設定情報はGoogle Sheetで一括指定して設定値を変更したら各端末に速やかに反映させる
  • それぞれの端末は遠隔で再起動等の操作が出来るようにする
  • 測定端末は複数台設置するが基本的に室内とする(屋外には設置しない)
  • 100V電源を確保できる場所とする(バッテリー駆動も一応試してみる)
  • 初期コスト、ランニングコストともに出来るだけローコストで実現する

ファイルのアクセス権

プログラム類

ファイルのアクセス権は最小にしておいた方がリスクが少なくなる。

プログラムと初期設定ファイルをchmodコマンドで最小のアクセス権に変更した。

尚、プログラム類のファイル・ディレクトリ構造は過去の記事を参照の事。

sudo chmod 400 initial.json
sudo chmod 400 temp-sensor-DHT22.py

証明書など

certディレクトリに移動して証明書類も全て権限を変更した。

cd cert
sudo chmod 400 *.*

以上で所有者だけが読み取りのみ可能なアクセス権限に変更される。

ラズパイゼロをデスクトップからCLIに変更

プログラム開発中はデスクトップ(GUIで操作可能)でプログラムのデバッグを行った。

またVNCも有効にしておりパソコンからラズパイゼロのデスクトップを操作をしていた。

しかしそのままにしておくとデスクトップ環境はリソースを余計に消費するのでブートオプションをCLI(Command Line Interface)に変更してインターフェースのVNCも無効にする。

この後はsshで接続してコマンドラインベースでの操作になる。

ブートをCLIに変更する

RaspberryPiのメニューから”Raspberry Piの設定”でシステムタブから、

  • ブートをデスクトップからCLIに変更する
  • 自動ログインの現在のユーザとしてログインするのチェックを外す
CLIに変更

VNCを無効にする

インターフェースタブに移動してVNCを無効にする。

またSSHは遠隔操作で使うので有効のままにしておく。

その後、再起動を行えば次回からはCLIベースで起動時はログインプロンプトが表示された状態(未ログイン)のラズパイゼロになる。

VNCの無効化

プログラムの自動起動

ラズパイゼロが起動した時に温湿度測定のプログラムが自動起動されるようにsystemdに設定する。

systemdの細かい設定については以前の記事を参照

Linuxの場合、自動起動はスクリプトを/etc/init.dに配置する方法や.profileに記述する方法等、複数存在する。

いずれの方法でも起動するだけであれば同じ様な事が出来るのだが、サービスの依存関係や異常終了時の対応などsystemdでのプロセスの起動はキメの細かい指定ができる事もあり推奨されている。

Serviceファイルの作成

temp-sensor.serviceファイルを/etc/systemd/system/配下に作成する。

sudo vi /etc/systemd/system/temp-sensor.service
[Unit]
Description = Temperaturea and Humidity Sensor 
After=network-online.target

[Service]
ExecStart=/usr/bin/python /opt/temp-sensor/temp-sensor-DHT22.py
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target

サービスのスタート

まずは以下のコマンドでサービスをスタートしてプログラムが正常に起動されるかを確認する。

正常にスタートされることが確認されたらOS起動時に自動的にプログラムがスタートするように設定(後述)を行う。

sudo systemctl start temp-sensor.service

ステータスの確認

以下のコマンドでサービスのプロセスが正常に起動されたかどうかのステータスを確認する。

sudo systemctl status temp-sensor.service

この時、何らかのエラーが出ている時には、

  • /var/log/syslog
  • /var/log/message

を確認する。

大抵の場合は「アクセス権限が無い」「スペルが間違っている」の場合が(自分は)多かった。

自動起動の設定

スタートでエラーが出ないことが確認出来たら以下のコマンドでOS起動時にプログラムを自動起動するようにする。

sudo systemctl enable temp-sensor.service

また前述のServiceセクションで”Restart=always”としているので何らかの原因でプログラムが終了してしまったとしてもプログラムは自動で再起動される。

sshで外部から遠隔操作

対象の機器に対して遠隔でsshでログインをして再起動やプログラムの入れ替えや各種設定変更が出来るようにする為の設定。

必要性の検討

しかしこの機能に関しては必要性を十分に検討してから実施するかどうかを判断する必要がある。

便利な半面、sshのポートをオープンにするのでセキュリティリスクは増すことになる。

容易に温湿度測定機器の所まで行けるのであれば遠隔操作は設定しないほうが安全だが複数の機器が遠くにあって一箇所から集中的に操作したいのであればsshによる外部からの遠隔操作を検討しても良いと思う。

しかしその際にsshのデフォルトポート番号(22)の変更とパスワード認証によるssh接続から秘密鍵、公開鍵を使う公開鍵暗号方式への変更は必須だと思うので十分注意して設定して欲しい。

構成

遠隔操作をするに辺り複数の方法が考えられる。

VPNを構築してセキュアなネットワークでssh接続をする方法も検討したが結局以前に行ったssh接続可能なサーバーをインターネット上に用意してsshのポートフォワード(トンネリング)を使って遠隔ログインする事にした。

サーバーをインターネット上に用意といってもこのブログを書いているサーバー(AWS EC2、Ubuntu 18.04、WordPress)が既にあるので新しく用意したわけではない。

およその構成図は以下の通り。

sshポートフォワードによる遠隔操作

手順

具体的な設定方法は以前のこちらの記事を参照して欲しい。

リンク先の記事を元に下記の手順にてラズパイゼロ→AWS EC2のssh接続の設定を行う。

  1. ラズパイからsshでポートフォワーディング
  2. AWS EC2にpuTTYで接続する
  3. ラズパイゼロへ接続
  4. 自動起動の設定

OSハング時

上記の遠隔操作の設定を行っていてもOSがハングしてしまった時は役に立たない。

また何らかの原因で電源やネットワークが喪失してしまった場合も現地に行かないとどうにもならない。

ただOSがハングしているので一旦ラズパイゼロの電源をOFFにして数秒後に再度ONにするだけで良いのであればスマートプラグを検討しても良いかも知れない。

スマートプラグについてはこちらの記事を参照して欲しいのだが定価だとラズパイゼロの本体価格より高くなってしまうので必要性を良く検討した上で採用するのが良いと思う。

後はwatchdog(システムが停止した時にリブート)を設定したり、systemd.timerで定期的にラズパイゼロを再起動しても良いと思う。

以上で今回の記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

2件のフィードバック

  1. 匿名 より:

    ありがとうございます!
    実際に頑張ってやってみます!

匿名 へ返信する コメントをキャンセル

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。