2021年度IoT研修用ラズパイの設定 

#１．目的
M5StackシリーズのATOM LiteとInfluxDB、Node-RED、Grafanaが稼働するサーバとでIoTシステムを構築するセミナーを開催するために、ラズパイを設定する。
設定にあたり、Qiitaの@dzonesasakiさんのページを参考にしました。

https://qiita.com/dzonesasaki/items/ab904d70fa4b3d4ce7ce


#２．準備
###（１）Raspberry Pi Imagerで、Raspberry Pi OS(32bit)版を32GBのマイクロSDメモリカードに焼きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36206/e768a7f7-3c79-f9d6-c6f5-5018918c0880.png)

###（２）ラズパイにSDを入れて起動し、 設定を行います。
   - 国を日本に （言語は日本語、タイムゾーンは東京）

![スクリーンショット 2021-07-07 152426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36206/e46f2108-73e4-87ce-f169-81ea32d40eec.png)

   - Enter new password, Confirm new password 同じパスフレーズを入力

![スクリーンショット 2021-07-07 152542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36206/6ce81ec5-8831-443b-2738-cbf97de27785.png)

   - ディスプレイ表示に余白がある場合は、this screen shows a black border...にチェック

![raspberry-pi-desktop-install-ver202101_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36206/4406982f-cf97-b724-ac19-55641b1882bf.png)


   - Wi-Fiを接続

:::note
ethernetでインターネット接続している場合は、あえてWi-Fiに接続させる必要はないのでスキップする。
:::

![raspberry-pi-desktop-install-ver202101_20 .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36206/49369679-4b06-23f7-f26b-d3646ba8cede.png)

   - アップデート

![スクリーンショット 2021-07-07 152647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36206/04c129e7-3ba2-29db-fbe3-b86a5b030145.png)

   - 再起動

![raspberry-pi-desktop-install-ver202101_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36206/2f5aadbf-f292-f960-5d13-f9f8ef9a05af.png)

#３．研修に必要なソフトウェアのインストール
ターミナルを利用して必要なアプリをインストール。次のコマンドをコピーして、ターミナルにペーストして実行する。

```
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y && bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) && sudo systemctl enable nodered.service && cd ~/.node-red/ && npm install node-red-dashboard node-red-contrib-dht-sensor node-red-contrib-ds18b20-sensor node-red-contrib-influxdb node-red-contrib-aedes node-red-contrib-calc && sudo systemctl restart nodered.service && sudo apt install -y influxdb influxdb-client && influx -execute="create database IoTSeminar" && cd ~/Downloads && wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - && echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list && sudo apt update && sudo apt install -y grafana && sudo /bin/systemctl daemon-reload && sudo /bin/systemctl enable grafana-server && sudo /bin/systemctl start grafana-server && sudo grafana-cli plugins install aceiot-svg-panel && sudo grafana-cli plugins install ae3e-plotly-panel && sudo grafana-cli plugins install agenty-flowcharting-panel && sudo grafana-cli plugins install bessler-pictureit-panel && sudo grafana-cli plugins install briangann-datatable-panel && sudo grafana-cli plugins install farski-blendstat-panel && sudo grafana-cli plugins install flant-statusmap-panel && sudo grafana-cli plugins install grafana-clock-panel && sudo grafana-cli plugins install grafana-googlesheets-datasource && sudo grafana-cli plugins install grafana-piechart-panel && sudo grafana-cli plugins install grafana-polystat-panel && sudo grafana-cli plugins install isaozler-paretochart-panel && sudo grafana-cli plugins install jdbranham-diagram-panel && sudo grafana-cli plugins install larona-epict-panel && sudo grafana-cli plugins install macropower-analytics-panel && sudo grafana-cli plugins install marcusolsson-csv-datasource && sudo grafana-cli plugins install marcusolsson-hourly-heatmap-panel && sudo grafana-cli plugins install michaeldmoore-annunciator-panel && sudo grafana-cli plugins install michaeldmoore-multistat-panel && sudo grafana-cli plugins install mtanda-google-calendar-datasource && sudo grafana-cli plugins install mtanda-histogram-panel && sudo grafana-cli plugins install mxswat-separator-panel && sudo grafana-cli plugins install natel-plotly-panel && sudo grafana-cli plugins install neocat-cal-heatmap-panel && sudo grafana-cli plugins install novatec-sdg-panel && sudo grafana-cli plugins install petrslavotinek-carpetplot-panel && sudo grafana-cli plugins install pierosavi-imageit-panel && sudo grafana-cli plugins install savantly-heatmap-panel && sudo grafana-cli plugins install scadavis-synoptic-panel && sudo grafana-cli plugins install snuids-radar-panel && sudo grafana-cli plugins install snuids-trafficlights-panel && sudo grafana-cli plugins install speakyourcode-button-panel && sudo chown -R grafana:grafana /var/lib/grafana/plugins/ && sudo systemctl restart grafana-server.service && sudo apt install -y jfbterm fonts-takao
```

:::note info
Node-REDのインストール中に以下の質問があるので、両方ともyを入力する。
　　Are you really sure you want to do this ? [y/N] ? y
　　Would you like to install the Pi-specific nodes ? [y/N] ? y
:::




###上記で実行している内容を以下で説明する。

##3.1　ソフトウェアのアップデート

```
$ sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y 
```

##3.2 Node-REDのインストール
Node-REDのインストール及びノードの追加設定

```
$ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) && sudo systemctl enable nodered.service && cd ~/.node-red/ && npm install node-red-dashboard node-red-contrib-dht-sensor node-red-contrib-ds18b20-sensor node-red-contrib-influxdb node-red-contrib-aedes node-red-contrib-calc && sudo systemctl restart nodered.service
```

##3.3 InfluxDBのインストール
InfluxDB、及びクライアントInfluxのインストール。データベースIoTSeminarを追加設定。

```
$ sudo apt install -y influxdb influxdb-client && influx -execute="create database IoTSeminar"
```

##3.4 Grafanaのインストール

Grafanaのインストール及び自動起動の設定。また、プラグインを32個インストールし、プラグインのユーザとグループ名をgrafanaに変更する。

```
$ cd ~/Downloads && wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - && echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list && sudo apt update && sudo apt install -y grafana && sudo /bin/systemctl daemon-reload && sudo /bin/systemctl enable grafana-server && sudo /bin/systemctl start grafana-server && sudo grafana-cli plugins install aceiot-svg-panel && sudo grafana-cli plugins install ae3e-plotly-panel && sudo grafana-cli plugins install agenty-flowcharting-panel && sudo grafana-cli plugins install bessler-pictureit-panel && sudo grafana-cli plugins install briangann-datatable-panel && sudo grafana-cli plugins install farski-blendstat-panel && sudo grafana-cli plugins install flant-statusmap-panel && sudo grafana-cli plugins install grafana-clock-panel && sudo grafana-cli plugins install grafana-googlesheets-datasource && sudo grafana-cli plugins install grafana-piechart-panel && sudo grafana-cli plugins install grafana-polystat-panel && sudo grafana-cli plugins install isaozler-paretochart-panel && sudo grafana-cli plugins install jdbranham-diagram-panel && sudo grafana-cli plugins install larona-epict-panel && sudo grafana-cli plugins install macropower-analytics-panel && sudo grafana-cli plugins install marcusolsson-csv-datasource && sudo grafana-cli plugins install marcusolsson-hourly-heatmap-panel && sudo grafana-cli plugins install michaeldmoore-annunciator-panel && sudo grafana-cli plugins install michaeldmoore-multistat-panel && sudo grafana-cli plugins install mtanda-google-calendar-datasource && sudo grafana-cli plugins install mtanda-histogram-panel && sudo grafana-cli plugins install mxswat-separator-panel && sudo grafana-cli plugins install natel-plotly-panel && sudo grafana-cli plugins install neocat-cal-heatmap-panel && sudo grafana-cli plugins install novatec-sdg-panel && sudo grafana-cli plugins install petrslavotinek-carpetplot-panel && sudo grafana-cli plugins install pierosavi-imageit-panel && sudo grafana-cli plugins install savantly-heatmap-panel && sudo grafana-cli plugins install scadavis-synoptic-panel && sudo grafana-cli plugins install snuids-radar-panel && sudo grafana-cli plugins install snuids-trafficlights-panel && sudo grafana-cli plugins install speakyourcode-button-panel && sudo chown -R grafana:grafana /var/lib/grafana/plugins/ && sudo systemctl restart grafana-server.service
```

##3.5 日本語ターミナル及び日本語フォントのインストール

研修では必要ないが、raspiを再設定する時に必要となるのでインストールしておく。

```
$ sudo apt install -y jfbterm fonts-takao
```

#４．ネットワークの設定

- ラズパイを無線のアクセスポイントとして機能させることで、ATOM Lite、PCと通信できるようにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36206/dd84babe-c5e0-29c1-01a6-349033f47edf.png)

- アクセスポイント化にはhostapdを利用し、DHCPサーバはdnsmasqを利用する。

##4.1 ソフトウェアのインストール
hostapd、dnsmasq、及びiptables-persistentをインストールする。

:::note info
　iptables-persistentインストール時、「現在の IPv4 ルールを保存しますか?」「現在の IPv6 ルールを保存しますか?」と聞かれるので、両方とも「はい」を選択する。現在のフィルタリングルールが/etc/iptable/rule.v4 および /etc/iptables/rule.v6に保存される。
:::

```
sudo apt install -y hostapd dnsmasq iptables-persistent
```

dnsmasqとhostapdのサービスを一旦終了させる。

```
sudo systemctl stop dnsmasq
```
```
sudo systemctl stop hostapd
```

##4.2 dhcpcd.confの変更

 - Raspi-OSのネットワーク関連の設定は、dhcpcd.confに記述する。
 - ネットワーク接続は、DHCPによるアドレス取得が基本。
 - dhcpcd.conf には、固定アドレスのみ記述する。
 - 今回は、Wifiのwlan0を固定アドレス192.168.2.1に設定する記述をする。


```
sudo nano /etc/dhcpcd.conf
```

最後尾に3行追記

```
interface wlan0
static ip_address=192.168.2.1/24
nohook wpa_supplicant
```

##4.3 dnsmasqの設定
DHCPで配布するIPアドレスのレンジを192.168.2.2～192.168.2.20とする。
今回は、DNSに関する部分はデフォルトのままとするので、インストールされているdnsmasq.confを退避させ、新たにDHCPだけ記述したdnsmasq.confファイルを作成する。

```
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.org
```
```
sudo nano /etc/dnsmasq.conf
```

以下の2行を追加する。

```
interface=wlan0
dhcp-range=192.168.2.2,192.168.2.20,255.255.255.0,24h
```

##4.4 無線LANのアクセスポイント化

###4.4.1 hostapdのデフォルト動作ファイルの編集
hostapdのデフォルト動作ファイルを編集し、hostapd.confの場所を指定する。

```
sudo nano /etc/default/hostapd
```

hostapd.confの場所は、/etc/hostapd/の配下とする。

```
#DAEMON_CONF=""
DAEMON_CONF="/etc/hostapd/hostapd.conf"
```

###4.2.3 hostapd.confファイルの作成

- 無線周波数帯はIEEE 802.11g
- 周波数チャンネルは１
- WPAは、バージョン２


```
sudo nano /etc/hostapd/hostapd.conf
```

以下の内容をコピー＆ペーストして、SSIDのYOUR_SSIDとパスフレーズのYOUR_PASSPHRASEを適宜変更すること。

```
# 接続するインタフェース
interface=wlan0

# デバイスドライバ
driver=nl80211

# 利用する周波数帯IEEE 802.11g
hw_mode=g

# 使用するチャンネル
channel=1

# MACアドレスによるフィルタリングはオフ
macaddr_acl=0

# 認証アルゴリズムはWPAのみ
auth_algs=1

# SSIDのステルスはオフ
ignore_broadcast_ssid=0

# EEE 802.11acは無効
ieee80211ac=0

# WMM（QoS制御）有効
wmm_enabled=1

# 日本を指定
country_code=JP

# IEEE 802.11dとIEEE 802.11hは有効
ieee80211d=1
ieee80211h=1

# 無線LANの出力
local_pwr_constraint=3

# スペクトラム制御
spectrum_mgmt_required=1

# WPAのバージョンは２
wpa=2

# 共有鍵認証の方式
wpa_key_mgmt=WPA-PSK

# 暗号化方式
wpa_pairwise=CCMP

# 暗号化方式
rsn_pairwise=CCMP

# SSID
ssid=YOUR_SSID

# パスフレーズ
wpa_passphrase=YOUR_PASSPHRASE

```

hostapdのマスク解除、自動起動の設定

```
sudo systemctl unmask hostapd
```
```
sudo systemctl enable hostapd
```

##4.3 IPの転送
ipV4のポートフォワードをコメントアウトする。

```
sudo nano /etc/sysctl.conf
```

```
#net.ipv4.ip_forward=1
net.ipv4.ip_forward=1
```

##4.4 IPマスカレード

###4.4.1 iptablesによるIPマスカレードの設定

```
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
```

###4.4.2 IPマスカレード設定ファイルの保存

上記のiptablesによるIPマスカレードの設定は、保存されないため、再起動すると再び上記コマンドを実行する必要がある。
netfilter-persistentコマンドで設定を保存する。
保存先は、iptables-persistentインストール時に作成された/etc/iptables/rules.v4、及びrules.v6となる。

```
sudo netfilter-persistent save
```

インストール時、「Save current IPv4 rules?」「Save current IPv6 rules?」と聞かれるので、両方とも「
はい」と答える。
/etc/iptable/rule.v4 および /etc/iptables/rule.v6に現在の設定状態が保存される。

#5.最後の仕上げ
##5.1 Lチカによるラズパイの稼働状況確認

ラズパイには、電源ラインのPWR LED（赤色）とSDカードへのアクセスを知らせるACT LED（緑色）がある。
これらを１秒間隔でONOFFするheartbeat設定することができる。
これを利用して稼働状況を確認できるようにする。
/boot配下にあるconfig.txtを編集して、最後尾に追記する。

```
sudo nano /boot/config.txt
```

今回は、視認性からPWR LEDをheartbeat化する。
PWR LEDの行頭をコメントアウトする。

```
# ACT LED(Green): heartbeat
#dtparam=act_led_trigger=heartbeat

# PWR LED(red): heartbeat
dtparam=pwr_led_trigger=heartbeat
```

##5.2 Node-REDを利用したシャットダウン

Raspi OSはGPIO3をGNDに接続することでシャットダウンできる。
通常は、スイッチ等を介してハード的にGNDに接続するが、今回はNode-REDを利用してソフト的にシャットダウンできるようにする。
ここで、GPIO3はI2Cのクロック信号SCLと共有する作りになっているので、「RaspberryPiの設定」でI2Cが無効になっていることを確認する必要がある。

###5.2.1 /boot/config.txtの編集

```
sudo nano /boot/config.txt
```

最後尾に以下の２行を追加する。

```
# shutdown botton GPIO3 -> GND
dtoverlay=gpio-shutdown,gpio_pin=3
```

###5.2.2 Node-REDによるシャットダウンプログラム

[Node-Red](http://localhost:1880/)にアクセスし、Node-RED上にGPIO３をLowにするプログラムを作成し、デプロイする。
タイムスタンプを実行することで、シャットダウンできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36206/9b1b0b5d-71a9-1891-e62a-fb08499320eb.png)

また、上記プログラムは、Node-REDのDashboardでもSHUTDOWNボタンを押すことでシャットダウンできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36206/24d3d54b-6e84-54d3-fee0-9ba926e8bcd8.png)


##5.3 コマンドラインブート

研修では、ラズパイのデスクトップ上で作業する項目はないので、ラズパイの負荷低減のためデスクトップを停止し、コマンドラインで起動するように変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36206/12a59a27-e16d-0a1d-fee4-b6b103a6a66c.png)

また、リモートで設定変更などをするために、SSHを有効にする。

![スクリーンショット 2021-07-14 102834.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36206/a65514fc-ce42-5268-3893-df8030f8cbb1.png)


##5.4 再起動

以上で、研修用のラズパイが完成したので、再起動（Reboot）する。