Raspberry Pi 3 (Buster) 一括セットアップ手順: node-redでスマートホーム用

# 新規インストールからの一連の設定手順です

いわゆるスマートホーム用Raspberry Piの設定。ディスプレイもキーボードもつなげずに使うこと前提です。

利用目的
- node-redでいろいろ
  - Amazon Echo + eRemote mini (RM Mini3) を使った家電の音声コントロール
  - LINEメッセージをGoogle Homeで読上げ
  - BLE温度・湿度センサーの情報取得
  - ひかり電話で相手側電話番号の情報をLINEに通知と読上げ

# Raspbianのインストール

## Raspbian Buster Liteをダウンロード
[Raspberry Piのダウンロードページ](https://www.raspberrypi.org/downloads/raspbian/)で、GUI無し版のRaspbian Buster Liteをダウンロード

## SDカードをSDFormatterでフォーマット

## Macでddを使って書き込み
SDカードのデバイスが/dev/disk2なのを確認。

```
$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *121.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            120.5 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +120.1 GB   disk1
                                 Logical Volume on disk0s2
                                 Unlocked Encrypted
/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *16.0 GB    disk2
   1:             Windows_FAT_32 STRETCHLITE             16.0 GB    disk2s1
```
unmount

```
$ diskutil unmountDisk /dev/disk2s1
Unmount of all volumes on disk2 was successful
```

書き込み (XXXは適切なデバイス名に置き換えること)

SDカードのデバイスが/dev/disk2の場合、/dev/rdisk2のように'r'をつけて指定すると高速に書き込みできます。

```
$ sudo dd bs=1m if=~/Downloads/2018-06-27-raspbian-stretch-lite.img of=/dev/rdiskXXX conv=sync
```

いつ終わるのか気になる人は、Ctrl+tを押せば途中経過が表示される。


# raspi-config

とりあえず、HDMIモニタとキーボードを繋げてデフォルトのuser:pi, password:raspberryでログインし、`sudo raspi-config`で以下の設定。

- 1.Change User Password
- 2.Network Options - Hostname (複数のRaspiがある場合要変更）
- 2.Network Options - Wi-fi
- 4.Localisation - Timezone
- 5.Interfaceing Options - SSH - Enable
- 7.Advanced Options - Memory Split - 16 (画面表示はしないのでGPUメモリを最小限に)

~~hostnname変更時は以下も行う~~ (Busterでは自動で追加されてるようなので不要)

```
sudo sh -c 'echo 127.0.1.1 $(hostname) >> /etc/hosts'
```

# SDカード延命措置

参考：[Raspberry PiのSDカードが壊れた！寿命を延ばす方法 5+1選!](https://iot-plus.net/make/raspi/extend-sdcard-lifetime-5plus1/)

## swap無効化

```
sudo dphys-swapfile swapoff
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile
```

## /tmp, /var/tmp, /var/logのtmpfs化

/etc/fstabに以下を追加。再起動するとログは消えるので注意。

```
tmpfs           /tmp            tmpfs   defaults,size=32m,noatime,mode=1777  0       0
tmpfs           /var/tmp        tmpfs   defaults,size=16m,noatime,mode=1777  0       0
tmpfs           /var/log        tmpfs   defaults,size=32m,noatime,mode=0755  0       0
```

ローテートされたログの保存数を減らす: /etc/logrotate.conf 中のrotateを修正(4 → 1)

```
# keep 4 weeks worth of backlogs
#rotate 4
rotate 1
```
## SDカードへの書き出しの頻度を下げる

/etc/fstabで/(root)ファイルシステムのオプションにcommit=240を追加。※4分立たないとSDカードに書き込まれないので注意。

```
/dev/mmcblk0p2 / ext4 defaults,noatime,commit=240  0 1
```

# 省電力設定
それほどの効果はないと思います。全部やってるわけではないです。

## /boot/config.txt (パワーLED点滅、CPUクロック下げる、WiFiのOFF)
```
dtparam=pwr_led_trigger=heartbeat
arm_freq_min=300
dtoverlay=pi3-disable-wifi
# dtoverlay=pi3-disable-bt
```

## /boot/cmdline.txt (あまりおすすめしません)
```
maxcpus=2
```

## HDMIをオフにする。10mA程度の節約 (おすすめしません)
```
sudo /opt/vc/bin/tvservice --off   (-pでon)
```

## USBをオフにする。100mAの節約 (おすすめしません)
有線LANが無効になる。上のpi3-disable-wifiと同時に設定してはいけない。
Raspberry Pi 3においては、WiFiをオフにするより有線LAN(USB)をオフにしたほうが効果が大きい。

```
echo 0 | sudo tee /sys/devices/platform/soc/*.usb/buspower
```

# 必要なアプリケーションのインストール

## apt-getで一括インストール

```
sudo apt-get -y install emacs-nox whois git bc mosh parallel iotop
```

gitの初期設定

```
git config --global user.name "My Name"
git config --global user.email "email address"
```

## node-red

参考: [Amazon Echoとラズパイで、音声で照明をon/offする](https://qiita.com/kikuzo/items/753b5065dde9633bda18#1-ラズパイとnode-red環境のセットアップ)

```
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
sudo systemctl start nodered.service
sudo systemctl enable nodered.service
```

あと、[Raspberry PiにおけるNode-REDの活用について](https://qiita.com/utaani/items/7155c62d6c5e96822afb)の「セキュリティ設定」も適用したほうがいいですね。

## BlackBeam社のスマートリモコン関連

参考: [素人でもスマートスピーカーから家電を操作できた](https://qiita.com/GITC_DM/items/0b17a6c1afd3893e7935#2python-broadlink)

```
sudo apt-get -y install python3-dev python3-pip
```
```
sudo pip3 install broadlink
```
```
mkdir ~/git
cd ~/git
git clone https://github.com/mjg59/python-broadlink.git
```

## Bluetooth (noble)

```
sudo apt-get -y install bluetooth libbluetooth-dev libudev-dev
```


## avahi (Google Homeを喋らせるのに必要)

```
sudo apt-get -y install avahi-daemon avahi-utils libnss-mdns libavahi-compat-libdnssd-dev
```

### sshサービスを公開する

参考: [avahi-daemonを設定してDNSサーバ運用をやめた](https://qiita.com/ymotongpoo/items/700884e64832f812b9db)

/etc/avahi/services/ssh.service

```xml
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">

<service-group>
  <name replace-wildcards="yes">%h</name>

  <service>
    <type>_ssh._tcp</type>
    <port>22</port>
  </service>
</service-group>
```

```
sudo systemctl restart avahi-daemon.service
```

これで、ssh pi@raspberrypi.local でsshログインできるようになる（ただし、Windowsからは不可)。

## Mackerelでの監視設定

Mackerelとは、はてなが提供しているサーバー監視サービスで、無料プランでも5台まで監視できるのでRaspberry Piの監視にちょうどいいです。問題発生時にメールだけでなくLINEに通知するようにもできます。

基本的な設定はこちらを参考: [Raspberry Pi を Mackerel で監視する](https://qiita.com/ww24/items/5409aefd87f14beff504)

上記設定後にこれ

- [自宅のグローバルIPアドレスの変更をMackerelで通知する](https://qiita.com/tinoue@github/items/303cd3e3d030f4e89c59)
- [MackerelでRaspberry Piの電源不足とオーバーヒートを監視する](https://qiita.com/tinoue@github/items/868b848999c3571ccf9f)

## baresip (ひかり電話の相手番号取得)

参考: [Linux でひかり電話にかかってきた電話番号を取得する](https://s.webry.info/sp/vogel.at.webry.info/201711/article_3.html)

```
sudo apt-get -y install baresip-core
```

インストール後、一度baresipを起動しCtrl+Cで終了
~/.baresip/configを編集。stdio.so, alsa.soをコメントアウト誌、cons.soを追加

```
#module                  stdio.so
#module                  alsa.so
module                   cons.so
```

~/.baresip/accounts に以下を追加

```
<sip:{内線番号}:{password}@{電話ルータのIPアドレス}>;auth_user={userId}
```

# SD関連

## 起動時にfsckをする

```
shutdown -rF now
```

[RPiのSDをバックアップして別のSDに書き込む](https://sonouchimaint.blogspot.com/2016/07/rpisdsd.html) : サイズが違う場合のパーティション操作