年末年始に向けて家電作りに挑戦してみる

## はじめに

[グロービス Advent Calendar 2018](https://qiita.com/advent-calendar/2018/globis) 21日目を担当する本間です。
普段は Ruby ばかり書いているので、たまには Ruby 以外のことを書きたいと思います。
タイトルのとおり、Raspberry Pi 3 Model B（本稿ではラズパイ3と記載します）を使って簡単な家電（HDDレコーダー）作りをしてみます。

**本記事では著作権で保護されたコンテンツを扱うシステムを構築します
いわずもがなですが、著作権で保護されたコンテンツを適正な利用範囲を超えて利用することは犯罪となります
扱いには充分注意して下さい**

## 必要なもの

この記事に沿ってオリジナルの HDD レコーダーを作ってみたいと思われた方は以下の材料を揃えてください。
沢山書いてますが、おそらく新たに買う必要があるものは Amazon とダイソーで何とかなると思います。

* ラズパイ3
* 2.5A程度が出力できる USB 充電器（ダイソーの¥300充電器が 2.4A 出て安くて重宝してます）
* 電源用マイクロ USB ケーブル（急速充電対応と書かれているものにしましょう）
* 中身を消して良いマイクロ SD カード（16GBあれば充分。速度が速ければ速いほど良いです）
* [NTTコミュニケーションズ 接触型 USBタイプ ICカード リーダーライター ACR39-NTTCom](https://www.amazon.co.jp/gp/product/B017Y8QV4O)
* [PLEX USB接続ドングル型地上デジタルTVチューナー PX-S1UD V2.0](https://www.amazon.co.jp/gp/product/B0141NFWSG)
* B-CAS カード（デジテルチューナーを中古で入手した場合は[再発行を依頼できます](https://www.b-cas.co.jp/support/faq/category03/faq012.html)）
* テレビアンテナ用同軸ケーブル
* 中身を消して良い USB 接続の HDD
* ラズパイ用 HDMI モニター
* ラズパイ用 USB 接続キーボード
* 作業用の Mac （Windows ユーザーは他の記事を参考に OS　インストールを乗り切って下さい）
* Wi-Fi
* DLNA 対応のテレビ（日本製のものは殆ど対応していると思います）

肝になりそうな IC カードリーダーとチューナーは Amazon のリンク貼っておきました。~~アフィリエイトのリンク貼れば良かった~~
これ以外の組合せでも組めるとは思いますが、ドライバーのインストールでハマったりするかもしれないので、本記事を参考にして新たに購入するならば上記をお勧めします。

なお、基本的なターミナルの使い方等は説明しません。ある程度のスキルを持っている方向けです。（Qiita 読者には不要な注釈かもしれませんが）

## ラズパイ3 に最新の RASPBIAN をインストールする

まずは、本体となるラズパイ3に OS をインストールします。

### OS イメージのダウンロード

作業用の Mac で OS のイメージをダウンロードします。

**ダウンロードURL**
https://www.raspberrypi.org/downloads/

不要なものはインストールしない、かつ足りないものは後からインストールすれば良いので、 LITE を選択します。ここでは Zip ファイルダウンロードを選びました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15184/0ae7ad49-4a58-d61b-0452-fffe3f8ec5d4.png)

ダウンロードしたファイルはチェックサムを確認しておきます。Mac では `shasum` コマンドで確認します。サイトには `SHA-256` で記載されているので、 `-a 256` オプションを忘れずに。

```bash
/Users/norifumi/Downloads% shasum -a 256 2018-11-13-raspbian-stretch-lite.zip
47ef1b2501d0e5002675a50b6868074e693f78829822eef64f3878487953234d  2018-11-13-raspbian-stretch-lite.zip
```

この値がダウンロードページのものと合わなかったら、ダウンロードし直します。合っていたら次に進みます。

### イメージをマイクロ SD カードに書き込む

作業用の Mac にマイクロ SD カードを差し込んで、 `diskutil list` を実行します。

```bash

/Users/norifumi% diskutil list

...（略）...

/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.5 GB    disk2
   1:             Windows_FAT_32 boot                    46.0 MB    disk2s1
   2:                      Linux                         15.5 GB    disk2s2

...（略）...

```

既に利用したことのある SD カードだと上記のようにパーティションが切られているかもしれません。
カード容量で SD がどの `IDENTIFIER` かを判断します。分かりづらかったら、一度カードを抜いて `diskutil` を実行すると、無くなっているものがどれかで判断できます。

SD カードの `IDENTIFIER` が `disk2` と分かったので、フォーマットします。 
`Apple` から始まるドライブをフォーマットすると辛い未来が待ち受けているので、指さし確認する位でちょうど良いと思います。
コマンドは以下を参考にして下さい。 `RASPBIAN` というのはカードに対して付けるラベルなので、何でも良いです。

```bash
/Users/norifumi% diskutil eraseDisk MS-DOS RASPBIAN disk2
```

少し時間が掛かります。以下のようなメッセージが出て。

```bash
Started erase on disk2
Unmounting disk
Creating the partition map
[ / 0%..10%..20%......................................... ]
```

このようなメッセージが出たら完了です。

```
Creating the partition map
Waiting for partitions to activate
Formatting disk2s2 as MS-DOS (FAT) with name RASPBIAN
512 bytes per physical sector
/dev/rdisk2s2: 29897536 sectors in 467149 FAT32 clusters (32768 bytes/cluster)
bps=512 spc=64 res=32 nft=2 mid=0xf8 spt=32 hds=255 hid=411648 drv=0x80 bsec=29904896 bspf=3650 rdcl=2 infs=1 bkbs=6
Mounting disk
Finished erase on disk2
```

フォーマットが終わったら、ダウンロードした OS イメージファイルを展開して書き込みます。
まずは、展開。

```
/Users/norifumi/Downloads% unzip 2018-11-13-raspbian-stretch-lite.zip 
Archive:  2018-11-13-raspbian-stretch-lite.zip
  inflating: 2018-11-13-raspbian-stretch-lite.img  
```

その後、一旦 SD カードをアンマウントします。マウントポイントを指定するので `/dev/disk2` となります。（この例の場合）

```
/Users/norifumi/Downloads% diskutil umountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
```

`dd` コマンドで書き込みます。 `if=` の後は、展開した OS イメージファイル、 `of=` の後は今アンマウントしたデバイスのマウントポイントを指定します。
この時、 `/dev/disk2` の場合に `/dev/rdisk2` といった具合に `r` を付けると高速に書き込めます。
また、 `bs=16m` というオプションを指定すると、ブロックサイズを 16MB として書き込めるので、これまた高速化します。

```
/Users/norifumi/Downloads% sudo dd bs=16m if=/Users/norifumi/Downloads/2018-11-13-raspbian-stretch-lite.img of=/dev/rdisk2
Password:
```

書き込み中はただ待たされるだけなので、気長に待ちます。せっかちな人は `control + t` を押すと途中経過が出ます。

```
load: 2.52  cmd: dd 54798 uninterruptible 0.00u 0.36s
29+0 records in
28+0 records out
469762048 bytes transferred in 48.450478 secs (9695715 bytes/sec)
```

全て終わるとこのような表示になります。末尾に記載されているとおり、およそ3分掛かりました。

```
111+1 records in
111+1 records out
1866465280 bytes transferred in 182.270500 secs (10240084 bytes/sec)
```

以上で Mac を使って OS イメージを書き込んだ SD カードを作成することができました。
この SD カードをラズパイに挿して、電源を入れます。

## ラズパイの設定

OS イメージが書き込まれたマイクロ SD カードを挿し、ディスプレイやキーボード、マウスを接続し、ラズパイの電源を入れます。
作業はなるべく Mac から実施したいので、早速 Wi-Fi に繋ぎます。

### Resized root file system

起動すると最初に root file system の調整が自動で行われます。その後再起動しますので、少し待ちます。

### Wi−Fi 設定

まずはログインします。初期状態では、以下のユーザーが設定されています。

* ユーザー名: `pi`
* パスワード: `raspberry`

これを使ってログインしたら、さっそく以下のコマンドを打ちます。 `<SSID>` と `<PASSPHRASE>` は利用する Wi-Fi のものを記載します。

```
pi@raspberrypi:~ $ sudo sh -c 'wpa_passphrase <SSID> <PASSPHRASE> >> /etc/wpa_supplicant/wpa_supplicant.conf'
```

（個人で使う分には気にならないとは思いますが）生パスフレーズが記載されているのが気になる場合は `/etc/wpa_supplicant/wpa_supplicant.conf` ファイルを開いて生の Wi-Fi パスフレーズがコメントとして書かれて居る箇所（ `#psk=XXXX` ）を削除しておきます。

ここで一旦再起動しましょう。

```
pi@raspberrypi:~ $ sudo init 6
```

再起動が完了したら、 DHCP で取得した IP アドレスを確認します。

```
pi@raspberrypi:~ $ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether b8:27:eb:12:34:56 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:12:34:57 brd ff:ff:ff:ff:ff:ff
    inet 192.168.43.22/24 brd 192.168.43.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::dc99:5b44:6a5f:b73f/64 scope link 
       valid_lft forever preferred_lft forever
```


`wlan0` の `inet` の箇所を確認します。この例では `192.168.43.22` が取得できています。
アドレスが取得出来ていることを確認できたら、 ssh を有効にし、後は作業用の Mac から操作します。

```
pi@raspberrypi:~ $ sudo service ssh start
```

作業用の Mac から ssh で接続できるか確認します。

作業用の Mac のコンソールから先程確認した IP アドレスに向けて pi ユーザーで ssh 接続します。
パスワードは初期設定のままです。

```
/Users/norifumi% ssh pi@192.168.43.22
pi@192.168.43.22's password: <raspberry：初期パスワード>
Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Dec 13 02:09:12 2018 from 192.168.43.224

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $
```

ここまでできれば、キーボードでログインした方はログアウトしても構いません。
ディスプレイやキーボードを外せます（ネットワーク設定等でミスしたらまた繋ぐ必要があります）。

### OS の初期設定を行う

ここからは、Mac から ssh で設定します。まずはお馴染みの `raspi-config` を実行します。

```
pi@raspberrypi:~ $ sudo raspi-config
```

こんな画面が出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15184/f06a5c8c-2e72-8fb5-6ca9-24767f9ea623.png)

順番に設定していきましょう。以下に記載の無いものは必要になった時に設定すれば良いと思います。

#### 1 Change User Password

これを選択して、エンターキーを押します。メッセージが表示された後にコンソールで新しいパスワードを2回聞かれるので同じものを入力します。
`Password changed successfully` と表示されたら完了です。

#### 2 Network Options

* `N1 Hostname`
    * 設定しておきましょう。拘りが無ければそのまま（`raspberrypi`）でも構いません。今回は `raspberrypi` のままにします。

#### 4 Localisation Options

* `I1 Change Locale`
    * `[ ] ja_JP.UTF-8 UTF-8` にチェックします。その後の質問も　`ja_JP.UTF-8` にします。
* `I2 Change Timezone`
    * `Asia` →　`Tokyo` を選択します
* `I3 Change Keyboard Layout`
    * キーボードを既に外していたら特に実行する必要はありません
* `I4 Change Wi-fi Country`
    * `JP Japan` を選びます

#### 5 Interfacing Options

**※これを忘れると面倒です**

* `P2 SSH`
    * これを選択して、有効化してください。これを忘れると次の再起動で ssh できなくなります。

#### 7 Advanced Options

最近のラズパイは初回起動時に自動で実施してくれるようですが、念のため。

* `A1 Expand Filesystem`
    * これを選択して実行します。

```
Root partition has been resized.
The filesystem will be enlarged upon the next reboot
```

と表示されたら完了です。 `Finish` を選択すると一度再起動され、これまでの設定が反映されます。

### IP アドレスを固定する

DHCP のままでも hostname を使ってアクセスはできますが、IP アドレスを固定しておきたい場合もあります。その時は以下の設定を行います。
今回は Wi-Fi を使って設定していますが、運用後のことも考えて有線 LAN も固定しておきます。

まず、有線 LAN のインターフェース名が自動で変更されないように、 `eth0` で固定する設定を追加します。

```
pi@raspberrypi:~ $ sudo vi /boot/cmdline.txt 
```

1行で設定がツラツラと書かれていますので、最後に以下の設定を追加します

```
net.ifnames=0
```

こんな感じになればOKです。

```
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=12345678-01 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait net.ifnames=0
```

そして、DHCP の設定を変更して固定されるようにします。

```
pi@raspberrypi:~ $ sudo vi /etc/dhcpcd.conf
```

末尾に以下の設定を記載します。 `eth0` と `wlan0` を指定しています。

```
interface eth0
static ip_address=192.168.43.200/24
static routers=192.168.43.254
static domain_name_servers=192.168.43.254

interface wlan0
static ip_address=192.168.43.201/24
static routers=192.168.43.254
static domain_name_servers=192.168.43.254
```

設定を反映するときは再起動します。次に ssh 接続する時は新しい IP アドレスになっていることに注意。

## 周辺機器の設定

ここから、ラズパイに接続する各周辺機器の設定を行います。引き続き Mac から ssh 接続で操作します。

### IC カードリーダー

カードリーダーを利用できるようにするためにいくつかパッケージをインストールします。ラズパイに IC カードリーダーを接続する前に、以下のコマンドを実行します。

```
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install pcscd libpcsclite-dev libccid pcsc-tools
```

インストールが完了したら、IC カードリーダーをラズパイの USB ポートに差し込みます。B-CAS カードもセットしておきます。
差し込んだら、以下のコマンドで B-CAS カードが認識できているかを確認します。

```
pi@raspberrypi:~ $ pcsc_scan
```

以下のような表示が出たらOKです

```
pi@raspberrypi:~ $ pcsc_scan
PC/SC device scanner
V 1.4.27 (c) 2001-2011, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.8.18
Using reader plug'n play mechanism
Scanning present readers...

(中略)

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
3B F0 12 34 56 78 9A BC DE F0 12 34 56
	Japanese Chijou Digital B-CAS Card (pay TV)

```

`Chijou Digital` という単語に圧倒されながら、確認出来たら `control + c` でコマンドを中断します。

### 地上デジタルTVチューナー

ドライバーは既に Linux カーネルに含まれているので、ファームウェアのファイルだけあれば利用可能です。
必要なファイルはメーカーのサイトの旧版のドライバーから手に入れることができます。

ダウンロード先： http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip

```
pi@raspberrypi:~ $ wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
pi@raspberrypi:~ $ unzip PX-S1UD_driver_Ver.1.0.1.zip
pi@raspberrypi:~ $ sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware
```

ここまで完了したら、以下のコマンドを実行します

```
pi@raspberrypi:~ $ lsusb
```

カードリーダーと、あとは元々ラズパイに搭載されているもののみ表示されます

```
Bus 001 Device 004: ID 072f:b100 Advanced Card Systems, Ltd ACR39U
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. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

地上デジタルTVチューナーを接続して、再度実行します

```
pi@raspberrypi:~ $ lsusb
```

```
Bus 001 Device 005: ID 3275:0080 VidzMedia Pte Ltd 
Bus 001 Device 004: ID 072f:b100 Advanced Card Systems, Ltd ACR39U
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. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

`VidzMedia` というのが増え、認識されたのが確認できました

## 録画用ソフトウェアのインストール

ここからソフトウェアをインストールして、コマンドラインで録画ができるところまで進めます

### デコーダーのインストール

[Linux用ARIB STD-B25ライブラリ](https://github.com/stz2012/libarib25) のダウンロードとインストールを行います

```
pi@raspberrypi:~ $ sudo apt-get install cmake
pi@raspberrypi:~ $ wget https://github.com/stz2012/libarib25/archive/master.zip
pi@raspberrypi:~ $ unzip master.zip
pi@raspberrypi:~ $ cmake libarib25-master
pi@raspberrypi:~ $ make
pi@raspberrypi:~ $ sudo make install
```

### 録画アプリケーションのインストール

コマンドラインから録画ができる [recdvb](http://cgi1.plala.or.jp/~sat/?x=entry:entry140127-152301) をインストールします

```
pi@raspberrypi:~ $ sudo apt-get install autoconf
pi@raspberrypi:~ $ wget http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.2.tgz
pi@raspberrypi:~ $ tar zxvf recdvb-1.3.2.tgz
pi@raspberrypi:~ $ cd recdvb-1.3.2
pi@raspberrypi:~ $ ./autogen.sh
pi@raspberrypi:~ $ ./configure -enable-b25
pi@raspberrypi:~ $ make
pi@raspberrypi:~ $ sudo make install
```

ここまでできたら、一度動作確認をします。地上デジタルTVチューナーに TV のアンテナ線を接続して、コマンドラインから以下のコマンドを実行します。
**※以下のコマンドの `29` は栃木（矢板発）のとちぎテレビの物理チャンネル番号です。チャンネル番号は[マスプロ社の資料](https://www.maspro.co.jp/contact/channel.pdf) 等を参考に、適宜変更します**

```
pi@raspberrypi:~ $ recdvb --b25 --strip 29 5 ~/sample.m2ts
```

コマンドの `5` は 5秒録画するという指定なので、5秒ほど待たされた後に完了します。
録画されたビデオを Mac 等で取得して、 [VLC for Mac OS X](https://www.videolan.org/vlc/download-macosx.ja.html) 等で再生してみます。

```
/Users/norifumi% scp pi@192.168.43.201:~/sample.m2ts ~/Desktop
```

デスクトップにコピーされた `sample.m2ts` ファイルを開いて確認して下さい。テレビ番組の内容が5秒表示されたらここまでの作業は成功です。

## ネットワーク越しにファイルを再生できるようにする

ラズパイに撮りためたテレビ番組を家庭内のテレビ等から見られるようにしたいので、 DLNA サーバーをインストールします。ラズパイに GUI を導入して、ラズパイに接続したディスプレイで再生しても良いのですが、家電感を出すにはやはりテレビで見たいです。

### USB 接続の HDD を追加する

DLNA サーバーを導入する前にラズパイに HDD を追加しておきます。録画した番組を SD カードに保存するとあっという間に容量を使い切りそうですし、OS とは別のドライブに保存したいので。
ラズパイに HDD を接続して、以下のコマンドを実行します。

**以下の操作を行うと接続されたHDDのデータは全て削除されます**

```
pi@raspberrypi:~ $ sudo fdisk -l
```

すると、以下のような表示が出てきます。今回は 500GB の HDD を接続しました。
`/dev/sda` に接続されていることが分かります。

```
（前略）

Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 00000A57-4A2C-0000-0034-0000789A0000

(後略)
```

このディスクをフォーマットし直します。

```
pi@raspberrypi:~ $ sudo mount | grep sda
```

何も表示されなければ自動でマウントされていないので、作業を開始できます。
（自動でマウントされていたら `umount` コマンドでアンマウントします）

`/dev/sda` で認識されているので、 `fdisk` コマンドでパーティションを切り直します。

```
pi@raspberrypi:~ $ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

A hybrid GPT was detected. You have to sync the hybrid MBR manually (expert command 'M').

Command (m for help): 
```

対象ディスクを誤っていると再度インストールし直しになるので、まずはパーティション一覧を確認します。
`p` コマンドを入力して、エンターキーを押します。
(この HDD は元々 Macbook に接続されていたものなので Apple boot があったりします)

```
Command (m for help): p

Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 00000A57-4A2C-0000-0034-0000789A0000

Device         Start       End   Sectors   Size Type
/dev/sda1         40    409639    409600   200M EFI System
/dev/sda2     409640 975503591 975093952   465G Microsoft basic data
/dev/sda3  975503592 976773127   1269536 619.9M Apple boot

```

このディスクで間違いありません。 `/dev/sda1`、 `/dev/sda2`、 `/dev/sda3`、全てを削除します。
`d` を入力してエンターキーを押します。

```
Command (m for help): d
Partition number (1-3, default 3): 1

Partition 1 has been deleted.

Command (m for help): d
Partition number (2,3, default 3): 2

Partition 2 has been deleted.

Command (m for help): d
Selected partition 3
Partition 3 has been deleted.
```

あっさり削除できます。再度設定を確認します。`p` コマンドを実行します。

```
Command (m for help): p
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 00000A57-4A2C-0000-0034-0000789A0000
```

パーティションが無くなりました。
`n` コマンドを実行して、新しいパーティションを作成します。

パーティション番号は `1`、パーティションの先頭は最小の数字（この例では `34`）、最後の数字はデフォルト（全部使う）にします。

```
Command (m for help): n
Partition number (1-128, default 1): 1
First sector (34-976773134, default 2048): 34
Last sector, +sectors or +size{K,M,G,T,P} (34-976773134, default 976773134): 

Created a new partition 1 of type 'Linux filesystem' and of size 465.8 GiB.
```

ここまでできたら、`w` コマンドで変更を反映して完了です。

```
Command (m for help): w
The device contains hybrid MBR -- writing GPT only. You have to sync the MBR manually.

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
```

次に、パーティションをフォーマットします。 `mkfs.ext4` コマンドを実行します。入力を求められたらエンターキーを押して先に進みます。

```
pi@raspberrypi:~ $ sudo mkfs.ext4 /dev/sda1
mke2fs 1.43.4 (31-Jan-2017)
Creating filesystem with 122096637 4k blocks and 30531584 inodes
Filesystem UUID: 082f76dd-7694-4613-b3c2-85278bcb9a4e
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (262144 blocks): 
done
Writing superblocks and filesystem accounting information: done 
```

あと一息です。今フォーマットしたパーティションをラズパイの起動時に自動でマウント（利用可能に）するようにします。
最初にマウント先を作成します。

```
pi@raspberrypi:~ $ sudo mkdir /var/lib/minidlna
```

次に、ディスクの UUID を調べます。

```
pi@raspberrypi:~ $ sudo blkid /dev/sda1
/dev/sda1: UUID="08abcdef-789a-4567-bcdef-123456789abc" TYPE="ext4" PARTUUID="12345678-6789-abcd-ef12-3456789a1234"
```

それらの値を `/etc/fstab` に追記します。

```
pi@raspberrypi:~ $ sudo vi /etc/fstab 
```

追記するのは以下の行です。最後に1行追記します。 `UUID` の値は上記で調べたものにします。

```
UUID=08abcdef-789a-4567-bcdef-123456789abc /var/lib/minidlna ext4 defaults 0 0
```

手動でマウントできるか確認します。

```
pi@raspberrypi:~ $ sudo mount -a
```

エラーが出なければOKです。念のため確認してみましょう。

```
pi@raspberrypi:~ $ mount | grep sda1
/dev/sda1 on /var/lib/minidlna type ext4 (rw,relatime,data=ordered)
```
上記のような表示が出ればOKです。
マウント先を `/var/lib/minidlna` にしていますが、このすぐ後に理由が分かります。

### ReadyMedia のインストール

DLNA サーバーソフトウェアの [ReadyMedia（旧MiniDLNA）](http://minidlna.sourceforge.net/) をインストールします。 `apt` を使って簡単にインストールできます。

```
pi@raspberrypi:~ $ sudo apt-get install minidlna
```

録画したファイルを DLNA で共有するために、ディレクトリのオーナーを変えます。
外付け HDD のマウントポイントをここにしておいたのは、 ReadyMedia がデフォルトでここを共有するからでした。

```
pi@raspberrypi:~ $ sudo chown pi:pi /var/lib/minidlna
pi@raspberrypi:~ $ ls -la /var/lib/minidlna/
合計 28
drwxr-xr-x  4 pi   pi    4096 12月 13 18:10 .
drwxr-xr-x 30 root root  4096 12月 13 18:21 ..
drwx------  2 root root 16384 12月 13 19:00 lost+found
```

試しに、先程 ５秒テスト録画したファイルを移動して、 Mac から試聴できるか確認します。

```
pi@raspberrypi:~ $ mv sample.m2ts /var/lib/minidlna
```

作業用の Mac で VLC for Mac OS X を立ち上げて、 `ローカルネットワーク` の `ユニバーサルプラグ & プレイ` を開きます。
少し待つと `raspberrypi:minidlna` といった名前（`:` の前はホスト名です）が見つかります。
`ビデオ` を開くと `sample`（先程のサンプル録画したファイルのファイル名）が見つかるので、それをクリックして再生します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15184/ab3ad6e6-a8ae-e217-0dc6-c008958f1d91.png)

録画したテレビ番組が見られれば成功です。
動作は問題無さそうですが、ログを確認すると、気になるメッセージが出ています。

```
pi@raspberrypi:~ $ cat /var/log/minidlna.log

（前略）

[2018/12/13 18:22:21] inotify.c:199: warn: WARNING: Inotify max_user_watches [8192] is low or close to the number of used watches [2] and I do not have permission to increase this limit.  Please do so manually by writing a higher value into /proc/sys/fs/inotify/max_user_watches.

（後略）
```

`Inotify` の `max_user_watches` が `8192` だと小さすぎるとのことでした。運用してみないと適正値は分かりませんが、何となく4倍くらいにしておきます。
現状の設定を念のため確認します。

```
pi@raspberrypi:~ $ sysctl fs.inotify.max_user_watches
fs.inotify.max_user_watches = 8192
```

やはり `8192` でした。設定を変えます。 

```
pi@raspberrypi:~ $ sudo vi /etc/sysctl.conf
```

一番最後に以下の1行を追加します。

```
fs.inotify.max_user_watches = 32768
```

設定変更を反映するには `-p` オプションを付けて `sysctl` コマンドを実行します。

```
pi@raspberrypi:~ $ sudo sysctl -p
fs.inotify.max_user_watches = 32768
```

先ほどと同じコマンドで反映されたか再度確認します。

```
pi@raspberrypi:~ $ sysctl fs.inotify.max_user_watches
fs.inotify.max_user_watches = 32768
```

OKでした。
あともう1個だけ、設定を変えておくと良い場所があります。

```
pi@raspberrypi:~ $ sudo vi /etc/minidlna.conf
```

以下の箇所を修正します。

```
（前略）

# Automatic discovery of new files in the media_dir directory.
inotify=yes # ← コメントアウトされているので、コメントを外します

（中略）

# SSDP notify interval, in seconds.
notify_interval=60 # ← コメントを外し、数字を 895 から 60 に変更

（後略）
```

ファイルを自動で探してくれる設定です。保存したら、 minidlna を再起動します。

```
pi@raspberrypi:~ $ sudo service minidlna restart
```

ここまでで、ある程度形になってきました。後は

* コマンドラインではなく、もっと簡単な方法で録画ができるようにしたい
* 録画したファイルが自動的に DLNA 共有ディレクトリに入って欲しい

が満たせれば、HDD レコーダーとして使えそうです。

## チューナーサーバーのインストール

インストールする順番が逆になりますが、録画サーバーとして [Chinachu](https://github.com/Chinachu/Chinachu) を使いたいと思います。そのため、まず [Mirakurun](https://github.com/Chinachu/Mirakurun) をインストールします。

### Node.js のインストール

Mirakurun をインストールするために、Node.js が必要なのでインストールします。
`apt-get` コマンドでインストールできる Node.js では Mirakurun のインストールがうまく行かないので、手動でインストールします。
[このドキュメント](https://github.com/nodesource/distributions/blob/master/README.md#debinstall)を参考に、 一部 `sudo` を足して実行します。

```
pi@raspberrypi:~ $ curl -sL https://deb.nodesource.com/setup_8.x | sudo bash -
pi@raspberrypi:~ $ sudo apt-get install -y nodejs
```

バージョンを確認すると以下のものが入りました。[Mirakurun の Requirements](https://github.com/Chinachu/Mirakurun#requirements--supported-platforms) を満たしています。

```
pi@raspberrypi:~ $ node -v
v8.14.0
pi@raspberrypi:~ $ npm -v
6.4.1
```

### Mirakurun のインストール

Node.js のインストールが完了したら、あとは `npm` コマンドで入ります。動作確認のために [Rivarun](https://github.com/Chinachu/Rivarun) もインストールしておくと便利です。

```
pi@raspberrypi:~ $ sudo npm install pm2 -g
pi@raspberrypi:~ $ sudo npm install mirakurun -g --unsafe --production
pi@raspberrypi:~ $ sudo npm install rivarun -g
```

エラーが出ずに終了したら次に進みます。

### Mirakurun の設定

まずチューナーの設定を行います。

```
pi@raspberrypi:~ $ sudo vi /usr/local/etc/mirakurun/tuners.yml
```

ファイルの最後に以下を追記します。 yaml ファイルなので、インデントも重要です。

```
- name: PX-S1UD
  types:
    - GR
  command: recdvb --b25 --strip <channel> - -
```

次に、チャンネルファイルの設定を変更します（以下は那須塩原市の例）。

```
pi@raspberrypi:~ $ sudo mirakurun config channels
```

[自動でチャンネルスキャン](https://github.com/Chinachu/chinachu/wiki/Gamma-Installation-V2#%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%82%B9%E3%82%AD%E3%83%A3%E3%83%B3-mirakurun210) してくれますが、時間が掛かるので、先ほどのマスプロ社が公開している資料を見て、チャンネル設定を書き込みました。

```
- name: GYT
  type: GR
  channel: '29'

- name: CX
  type: GR
  channel: '35'

- name: TBS
  type: GR
  channel: '15'

- name: TX
  type: GR
  channel: '18'

- name: EX
  type: GR
  channel: '17'

- name: NTV
  type: GR
  channel: '19'

- name: NHK E
  type: GR
  channel: '39'

- name: NHK G
  type: GR
  channel: '47'
```

以上が完了したら、一度 Mirakurun を再起動します。

```
pi@raspberrypi:~ $ sudo mirakurun restart
[PM2] Applying action restartProcessId on app [mirakurun-server](ids: 0)
[PM2] [mirakurun-server](0) ✓
┌──────────────────┬────┬─────────┬──────┬─────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name         │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem       │ user │ watching │
├──────────────────┼────┼─────────┼──────┼─────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ mirakurun-server │ 0  │ 2.7.4   │ fork │ 722 │ online │ 1       │ 0s     │ 0%  │ 15.3 MB   │ root │ disabled │
└──────────────────┴────┴─────────┴──────┴─────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app
```

再起動したら、ログを確認してエラーが無いことをチェックします。

```
pi@raspberrypi:~ $ sudo mirakurun log server
```

特にエラーが出ていなければ、以下のコマンドを打って、とちテレを5秒録画してみます。

```
pi@raspberrypi:~ $ rivarun --ch GR/29 5 /var/lib/minidlna/tochitele.m2ts
status: 200
headers: {"server":"Mirakurun/2.7.4","content-type":"video/MP2T","date":"Fri, 14 Dec 2018 12:06:49 GMT","connection":"close","transfer-encoding":"chunked"}
```

保存先を DLNA で共有しているディレクトリにしたので、録画ファイルが DLNA を経由して見られればOKです。

## 録画サーバーのインストール

[Chinachu をインストール](https://github.com/Chinachu/Chinachu/wiki/Gamma-Installation-V2)します。Github からソースを取得してコンパイルするので、 `git` コマンドが使えるようにします。

```
pi@raspberrypi:~ $ sudo apt-get install git
```

ソースコードを取得します。

```
pi@raspberrypi:~ $ git clone git://github.com/kanreisa/Chinachu.git ~/chinachu
```

インストーラーを実行します。 `Auto` を選びます。

```
pi@raspberrypi:~ $ cd ~/chinachu/
pi@raspberrypi:~/chinachu $ ./chinachu installer
Chinachu Installer Menu:
[!] These are installed under all /home/pi/chinachu/...
[!] Recommend the Auto installation.
1) Auto (full)		3) Node.js Environment	5) ffmpeg
2) submodule		4) Node.js Modules
what do you install? > 1
selected: Auto (full)
```

かなり時間が掛かるので、このまましばらく放置します。先に `tmux` をインストールして、セッションが切れないようにすると良いかも知れません。
以下のような表示が出たら完了です。（ここでインストールされる `ffmpeg` は使わないのですが）

```
（前略）
ffmpeg-4.1-32bit-static/ffmpeg
ffmpeg-4.1-32bit-static/GPLv3.txt
'ffmpeg-release-32bit-static.tar' を削除しました
Creating libav aliases...
'/home/pi/chinachu/usr/bin/avconv' -> '/home/pi/chinachu/usr/bin/ffmpeg'
'/home/pi/chinachu/usr/bin/avprobe' -> '/home/pi/chinachu/usr/bin/ffprobe'
ffmpeg --> done.
```

### ARM 用 ffmpeg の導入

Chinachu の設定の前に [ffmpeg build](https://johnvansickle.com/ffmpeg/) のサイトから ARM 用にビルド済みの ffmpeg をダウンロードし、 Chinachu が標準でインストールしたものと入れ替えます。

```
pi@raspberrypi:~ $ wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-armhf-static.tar.xz
pi@raspberrypi:~ $ tar xvf ffmpeg-release-armhf-static.tar.xz
pi@raspberrypi:~ $ cd ffmpeg-4.1-armhf-32bit-static
pi@raspberrypi:~/ffmpeg-4.1-armhf-32bit-static $ cp ffmpeg ffmpeg-10bit ffprobe qt-faststart ~/chinachu/usr/bin/
pi@raspberrypi:~/ffmpeg-4.1-armhf-32bit-static $ sudo cp ffmpeg ffmpeg-10bit ffprobe /usr/local/bin
```

### Chinachu の設定

Chinacu の設定を行います。細かい設定は運用しながら行うとして、今は動くための最低限のものだけ。

```
pi@raspberrypi:~/chinachu $ cp config.sample.json config.json
pi@raspberrypi:~/chinachu $ vi config.json
```

`uid` が設定されていないので、 `pi` ユーザーで動かします。また保存先を `/var/lib/minidlna/` に変更し、ストリーミング再生時に HW 支援を使用します。

```
  "uid": null,
# ↓ "pi" に変更
  "uid": "pi",

  "recordedDir" : "./recorded/",
# ↓ "/var/lib/minidlna/" に変更
  "recordedDir" : "/var/lib/minidlna/",

  "vaapiEnabled": false,
# ↓ true に変更
  "vaapiEnabled": true,
```

次に空のルール設定ファイルを作成します。この辺は本家のインストレーションガイドのとおりに進めます。

```
pi@raspberrypi:~/chinachu $ echo [] > rules.json
```

### Chinachu の動作チェック

ここまでできたら、 Chinachu を起動して動作確認します。

```
pi@raspberrypi:~/chinachu $ ./chinachu service wui execute
```

特にエラーが表示されず、コマンドが終了しなければOKです。以下のような表示がありますので

```
14 Dec 09:34:31 - HTTP Open Server Listening on { address: '192.168.43.200', family: 'IPv4', port: 20772 }
```

ブラウザで `http://[http://[ラズパイのIPアドレス]:20772]/` （この例だと IPアドレスは `192.168.43.200`）にアクセスします。以下のような画面が出ればここまで成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15184/72e1bba0-7afe-2652-cf19-88c81495220c.png)

まだ、番組表等は取得していないので、取得します。ラズパイのコンソールで `control+¥` を押して、サーバーを停止し、以下のコマンドを実行します。

```
pi@raspberrypi:~/chinachu $ ./chinachu update
```

特に Mirakurun への接続エラー等が出なければOKです。再度

```
pi@raspberrypi:~/chinachu $ ./chinachu service wui execute
```

を実行して、ブラウザからアクセスして、番組表が取得できればOKです。

![a57c0bf0-1a2b-df7b-8599-e4a49930f505.png](https://qiita-image-store.s3.amazonaws.com/0/15184/ff476664-77d4-3ae8-591f-59aff64ba701.png)


### 自動実行の設定

ここまで設定できたら、 Chinachu が自動で起動するように設定します。

```
pi@raspberrypi:~/chinachu $ sudo pm2 start processes.json
pi@raspberrypi:~/chinachu $ sudo pm2 save
```

エラーが出ずに実行できたら、一度再起動して、自動で起動できたことを確認します。

```
pi@raspberrypi:~/chinachu $ sudo init 6
```

再起動後にブラウザで Chinachu にアクセスできたら成功です。

## 最後に

実装中は Mac の VLC プレイヤーで再生を試したりしていましたが、家庭用のテレビからも再生できるようになっています。
例えば、 Panasonic のテレビであれば「お部屋ジャンプリンク」という機能で、家庭内の LAN 上のラズパイが見つけられ、そこに録画したファイルが再生できます。

また、最近のテレビにはブラウザ機能も付いているので、そのブラウザで Chinachu をブックマークしておけば、テレビから Chinachu の番組表を開いて、録画することもできます。もちろん、スマートフォンで Chinachu を操作しても良いでしょう。

ここまでできれば、一応家電と言えるのでは無いでしょうか。オープンソースソフトウェアだけでここまでできることに、作者の皆さまには感謝しかありません。
年末年始は、ここから自分なりのカスタマイズを楽しんでみたいと思います。