久しぶりの投稿です。

今回はraspberry piを使用したNASを作ってみました。

ただ、ラズパイにUSBハードディスクをつけてSamba共有しただけで、大したことがなかったので、ついでに、ディスプレイがOS画面なのはさみしかったので、天気予報表示サイネージを救ってみました。
どちらかというとこっちがメインになっちゃいましたが。。。

NAS構築

まずはラズパイをNAS化しましょう。
ラズパイのOSインストールはRaspberry pi Imagerを使って入れますが、詳細は割愛します。

NTFSインストール

今回接続するハードディスクはWindowsで使用していたのでNTFSになっています。

フォーマットせず中身はそのまま共有したいので、まずはNTFSが認識するようにします。

sudo apt install -y ntfs-3g

最新OSではインストール済みのようなので不要かもしれません。

ハードディスクを接続

まずは、USBでハードディスクを接続します。

数年前に購入した玄人志向のハードディスクが4本刺さるハードディスクステーション(スタンド)を使って1つのUSBで4本ハードディスクを接続します。

接続すると自動マウントしてくれるようですが、3本しかマウントできないみたいなので、1本は設定を追加します。

まずは接続状態を確認します。

$ lsblk -f
NAME        FSTYPE FSVER LABEL      UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
loop0       swap   1
sda
tqsda1
mqsda2      ntfs         DriveName1 XXXXXXXXXXXXXXX1
sdb
tqsdb1
tqsdb2      ntfs         DriveName2 XXXXXXXXXXXXXXX2                      123.2G    75% /media/xxxxxx/DriveName2
mqsdb3      ntfs         DriveName3 XXXXXXXXXXXXXXX3                          2T     9% /media/xxxxxx/DriveName3
sdc
tqsdc1
mqsdc2      ntfs         DriveName4 XXXXXXXXXXXXXXX4                        1.9T    66% /media/xxxxxx/DriveName4
mmcblk0
tqmmcblk0p1 vfat   FAT32 bootfs XXXX-XXXX                                 424.5M    17% /boot/firmware
mqmmcblk0p2 ext4   1.0   rootfs XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX        6.2G    50% /
zram0       swap   1     zram0  XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX                    [SWAP]

以下のコマンドでマウントのテストをします。

# マウントポイントを作成
sudo mkdir /media/xxxxxx/DriveName1
# マウント
sudo mount -o uid=xxxxxx -t ntfs-3g UUID=XXXXXXXXXXXXXXX1 /media/xxxxxx/DriveName1
# 確認
ls -l /media/xxxxxx/DriveName1
# マウント解除
sudo umount /media/xxxxxx/DriveName1

正常にマウント出来たらfstabに設定を追加します。

sudo nano /etc/fstab
# 追加
UUID=XXXXXXXXXXXXXXX1       /media/xxxxxx/DriveName1       ntfs-3g       defaults          0       0
UUID=XXXXXXXXXXXXXXX2       /media/xxxxxx/DriveName2       ntfs-3g       defaults          0       0
UUID=XXXXXXXXXXXXXXX3       /media/xxxxxx/DriveName3       ntfs-3g       defaults          0       0
UUID=XXXXXXXXXXXXXXX4       /media/xxxxxx/DriveName4       ntfs-3g       defaults          0       0

設定を反映させます。

sudo mount -a

うまくいったら一度再起動しましょう。

Samba共有

まずはインストールします。

sudo apt install -y samba
systemctl status smbd

Sambaのパスワードを設定します。

sudo smbpasswd -a xxxxxx

smb.confに共有設定を追加します。

nano /etc/samba/smb.conf
# 追加
[Drive1]
path = /media/xxxxxx/DriveName1
browsable = yes
guest ok = no
read only = no

[Drive2]
path = /media/xxxxxx/DriveName2
browsable = yes
guest ok = no
read only = no

[Drive3]
path = /media/xxxxxx/DriveName3
browsable = yes
guest ok = no
read only = no

[Drive4]
path = /media/xxxxxx/DriveName4
browsable = yes
guest ok = no
read only = no

設定を反映させます。

sudo systemctl restart smbd

ほかのPCからアクセスして共有フォルダを確認しましょう。

うまくいったら、一度、再起動します。

以上で、NAS化は完了です。

セキュリティ設定や、ファイヤーウォールやバックアップツールなどをインストールしたほうがいいかもしれませんが、ここでは割愛します。

天気予報サイネージ

NAS用に7インチのモニターを新調しましたが、日ごろは表示するものがなく寂しいので天気予報を表示することにしました。

適当なアプリで実現できないかと探してみましたがいいものがないので自作します。

今回作成したソースはGitで公開していますので、使い方など詳しくはこちらを参考にしてください。

アプリの構成

今回のアプリは以下の構成で作ります。

  • マルチプラットフォームアプリを作れるfletを使用しました
  • 天気情報は気象庁のAPIから取得しました
  • アイコンはciscorn様のjma-weather-imagesから拝借しました

開発環境構築

最新OSにはPython3.13が入っていたので、そのまま使用します。

まずはpython環境を作りましょう。

# とりあえず、OSアップデート
sudo apt update
sudo apt upgrade -y

# 日本語フォントインストール
sudo apt install fonts-noto-cjk fonts-mplus fonts-ipafont-gothic fonts-ipafont-mincho fonts-vlgothic fonts-takao fonts-morisawa-bizud-gothic fonts-morisawa-bizud-mincho

# プロジェクトフォルダ作成
mkdir weather-signage
cd weather-signage

# 仮想環境作成
python -m venv .venv
source .venv/bin/activate

# fletをインストール
pip install "flet[all]==0.28.3"

# 初期化
flet create .

fletの最新版は0.80ですが、かなり仕様が変わっているようで過去の情報が使えません。

なので、今回は0.28.3を使用しています。

初期化でサンプルプログラムが生成されますので、実行すると画面が表示されます。

flet run

実装した内容

今回作った画面は以下のような感じです。

気象庁APIから地方、県、エリアの一覧を取得してプルダウンで選択できるようにしています。

選択した地方、県の気象情報をAPIで取得し、その中の該当エリアの天気コードを取得し、codes.jsonで翻訳(”101″⇒「晴れのちくもり」とか)と画像の取得を行って表示しています。

天気コードの翻訳のためのjsonが気象庁で公開されていないようなので、画像と合わせてciscorn様のjma-weather-imagesをお借りしました。(ありがとうございます)

気象庁のAPI仕様が明確にわからないことと、エリアによってJSON構造が異なっているようなので、共通的に使えるところだけ使いました。

最高・最低気温や降水確率も出したかったのですが、JSON構造の分析がかなりややこしいので諦めました。

やりたい人は以下を参考にしていただければいいと思います。

気象庁ホームページの利用規約

気象庁API – 配信しているデータに対応する時刻

気象庁API – エリア一覧

気象庁API – アメダス(観測所)一覧

気象庁API – アメダス配信データ 各要素の説明

気象庁API – 天気予報

https://www.jma.go.jp/bosai/forecast/data/forecast/{office_code}.json

気象庁API – エリア毎の注意報/警報

https://www.jma.go.jp/bosai/warning/data/warning/{area_code}.json

気象庁API – アメダス(全国地図表示用)

https://www.jma.go.jp/bosai/amedas/data/map/{yyyymmddhhmm00}.json

【Colab / Python】気象庁API – 気象データの収集

気象庁ホームページ防災気象情報のURL構造

気象庁API(エリア一覧)の分析

エリア一覧(JSON)の1階層目は以下ののようになっています。

  • “centers”:地域
  • “offices”:県
  • “class10s”:エリア

それぞれ、以下のような構造のJSONとなっています。

エリアコードをキーとして、”name”に名称、”children”には以下のエリアコードの一覧となっています。

プルダウンに”name”を表示し、”children”に含まれる内容を子プルダウンに表示するように実装しました。

気象庁API(天気予報)の分析

1階層目には以下の2つのJSONが登録されているようです。

  • 1つ目:直近の情報
  • 2つ目:1週間分の情報

直近の情報が2日分だったり、3日分だったりするし、一週間分の情報が当日からたっだり、翌日からだったりするので、仕様がよくわかりませんでした。

なので、当日分は直近情報から、翌日以降は一週間分の情報から取得するようにしました。

風力情報なども含まれているようですが、地域ごとに内容が違うみたいなので、使わないようにしています。

まとめ

今まで、WindowsマシンをNASの代わりにしていました。

今回、ラズパイ5に変えて数週間使っていますが、まったくそん色なく使えます。

静かだし、電力消費も少ないし、起動・シャットダウンも早いし、非常に気に入っています。

画面に天気予報を表示して、シャットダウン機能も付けたので、シャットダウンをメニューから選ぶ面倒もなくなりました。

今後、時計機能とか色々つけてもいいと思っています。

fletのアプリはWebで見ることもできるし、iphone、Androidアプリにもなってくれるので、なかなか良いです。

iphoneはAppleDeveloperライセンスがないとパッケージアプリとして使えませんが、デバックはできたので試してみましたがちゃんと動きました。

pythonで開発できるので重宝しそうです。