ラズパイZeroで作るウエザーステーション

ラズパイZeroが1台余っていることから、ウエザーステーションを作ってみました。

# 機材

* ラズパイZero
* 液晶モジュール
  * [Waveshare 3.5inch RPi LCD (A)](https://www.waveshare.com/wiki/3.5inch_RPi_LCD_(A)#Overview)
  * 千石電商から入手しました。

* 電源アダプタ
  * LCD表示の関係で、DC5V 2.5A以上のものが必要です。今回は3Aのアダプタを利用しました。
* SDカード 8GB


# 構築手順

## ラズパイOSの準備と初期設定

以下のサイトからOS imagerをダウンロードして、SDカードにOSイメージをロードします。
[Raspberry Pi OS](https://www.raspberrypi.com/software/)

機種を選択後、OS画面では、以下のLegacy 32bit版を選択します。
![キャプションを入力できます](https://camo.elchika.com/5293ce0fb3f8c7009193ade03397014b908a3339/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f61353765303964372d323439622d343061632d383832662d666562633331616338326362/)

OSのカスタマイズでは、パスワードや、wifiやSSHの有効化などを設定しました。

HDMIやキーボードは接続せずに、ZeroとLCDを接続してからZeroの電源を入れます。
PCからTeraTermでSSH接続を行います。

![キャプションを入力できます](https://camo.elchika.com/63f78a0490396016bcc7891522c6d64e75033c90/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f62656339336232392d653939612d346536662d386139382d663261616262333462366330/)


![キャプションを入力できます](https://camo.elchika.com/3063c330b217d846304788315f63b22010fd25cf/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f62666166316261302d653832302d346365392d386230392d666666623639333336353333/)

![キャプションを入力できます](https://camo.elchika.com/78a8a2bf326d71e4a92a0853540e006bb9b594fc/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f39323335373333322d626236342d343234662d623837392d333339376239613233623930/)

無事接続できたら、OS/LCD周りの各種初期設定を実施します。



```bash:

#まずはアップデートを行います。
sudo apt-get update -y && sudo apt-get upgrade -y
# WaveshareのLCD設定です。
git clone https://github.com/waveshare/LCD-show.git
cd LCD-show/
chmod +x LCD35-show
 ./LCD35-show
# この再起動後にLCD画面表示するはずですが、なぜか表示されず。以下を実行して再起動したところ表示されました。
./LCD35-show lite

```

![キャプションを入力できます](https://camo.elchika.com/566dab7520f4ca64a10fb1246f9b86d6f206ef56/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f65396666386431352d636464302d346231392d613239642d303062646165626437363862/)

Xの画面がLCDに表示されましたが、今回はXは不要なので、起動時にXが起動しないように設定を変更します。

```
sudo raspi-config
```
を実行して、以下の要領で設定を変更します。

1 System Optionを選択
![キャプションを入力できます](https://camo.elchika.com/6b2905686dac573f587fe7e553874bac95e87959/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f30663632323863612d653033642d343430322d616231622d323363396562636361653363/)
S5 Boot/Auto Loginを選択
![キャプションを入力できます](https://camo.elchika.com/208f373a4deb8efc082eb06d516d4d92ee5dd0a7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f32346437333238612d393461362d346138362d616239302d653837316265316538623539/)
B1 Consoleを選択します。
![キャプションを入力できます](https://camo.elchika.com/9a036e0cbf0987a012ba3417967b48d83b549337/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f30396333343234342d653932622d343534362d626564352d373331626538373466353438/)
再起動を求められるので再起動します。

![キャプションを入力できます](https://camo.elchika.com/1961214cdfe453d641bce2eeccd95d2f8d4a2f39/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f38636238633061392d326466362d346139392d613638652d383861626335383631666234/)

再起動後は、LCDにはコンソール画面が表示されました。

![キャプションを入力できます](https://camo.elchika.com/88f17f91a08351f7fb620a9e092e7287a618048a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f36376230323738302d613935622d343932302d393861382d376662333464346237303034/)

この後必要になるので、日本語ロケールの追加を行います。
```
sudo raspi-config
```
を実行して、以下の要領で設定を変更します。

![キャプションを入力できます](https://camo.elchika.com/8105f234700de71243cecc895c831193a845b0cd/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f65623334373337302d326436322d343563322d393634332d633934303630316234386531/)

![キャプションを入力できます](https://camo.elchika.com/2a92b897dbab8b1a492e9cf879a180a5c5d57c40/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f61613438363935382d336339652d346564362d383664362d363166333936616466623739/)

![キャプションを入力できます](https://camo.elchika.com/34ad261284ebce81576d276c47ebebb36206d0e7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f39303331313337322d336539652d346631372d393034612d376137656639373162316566/)
最後の選択肢は、このままでOKをおします。

![キャプションを入力できます](https://camo.elchika.com/5fbc022bd35c1e8a4fd662a3fc2b0547ce2e4b0f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f33316536333132312d623735632d343863372d623863612d306339626366616334643337/)

日本語フォント(GoogleのNotoSansフォント)もインストールします。

```
wget -O NotoSansCJKjp-hinted.zip https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip
unzip -d NotoSansCJKjp-hinted NotoSansCJKjp-hinted.zip
sudo mkdir -p /usr/share/fonts/opentype
sudo mv -fv ./NotoSansCJKjp-hinted /usr/share/fonts/opentype/note
rm -rfv NotoSansCJKjp-hinted.zip

wget -O NotoSerifCJKjp-hinted.zip wget https://noto-website-2.storage.googleapis.com/pkgs/NotoSerifCJKjp-hinted.zip
unzip -d NotoSerifCJKjp-hinted NotoSerifCJKjp-hinted.zip
sudo mv -fv ./NotoSerifCJKjp-hinted /usr/share/fonts/opentype/note
rm -rfv NotoSerifCJKjp-hinted.zip

sudo fc-cache -fv

```

既定ではWifiのパワーセーブがonになっており、一定時間時間がたつと通信ができなくなるようです。パワーセーブをoffにします。
ネットの情報を元に、以下設定を行います。
以下コマンド実行
```
sudo nano /etc/dhcpcd.exit-hook
```
こちらの内容を張り付けて保存し、終了、再起動します。
```
[ -n ${disable_pm} ] || return 0
 
if [ “${interface}” = “wlan0” ]; then
        case ${reason} in
                CARRIER | NOCARRIER)  iwconfig ${interface} power off ;;
                STOP | STOPPED) iwconfig ${interface} power on ;;
        esac
fi
```


## ウエザーステーションソフトの導入と設定

基本的に[WeatherPi](https://github.com/miyaichi/WeatherPi)ページに記載の通りです。
```
# 必要なモジュールのインストール
sudo apt-get install rng-tools gettext -y
sudo apt-get install python3-pygame python3-pillow -y

# 本体のコピーと初期設定
git clone https://github.com/miyaichi/WeatherPi.git
cd WeatherPi
sudo cp WeatherPi_Service.sh /etc/init.d/WeatherPi
sudo chmod +x /etc/init.d/WeatherPi
sudo chmod +x WeatherPi.py
sudo systemctl enable WeatherPi
sudo chown -v root:root /usr/bin/python3
sudo chmod -v u+s /usr/bin/python3
```

この後config.jsonを作成します。
```
nano config.json
```

私のconfig.jsonは以下です。
openweather appidは事前に取得しておく必要があります。
addressと、緯度、経度はご自身の情報を入れましょう。

```
{
  "openweather_appid": "入手したappidをここに張り付ける",
  "google_api_key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",

  "address": "<市区町村を記載>",
  "latitude": 緯度を数字で入力,
  "longitude": 経度を数字で入力,

  "locale": "ja_JP.UTF-8",
  "units": "metric",

  "SDL_FBDEV": "/dev/fb1",
  "display": [480, 320],
  "fonts": {
    "name": "Noto Sans Mono CJK JP",
    "size": {
      "large": 32,
      "medium": 24,
      "small": 17
    }
  },

  "modules": [
    {
      "module": "Alerts",
      "config": {
        "rect": [0, 0, 480, 20]
      }
    },
    {
      "module": "Weather",
      "config": {
        "rect": [0, 20, 410, 120]
      }
    },
    {
      "module": "WeatherForecast",
      "config": {
        "rect": [0, 120, 480, 90],
        "forecast_days": 6
      }
    },
    {
      "module": "SunriseSuset",
      "config": {
        "rect": [0, 220, 80, 80]
      }
    },
    {
      "module": "MoonPhase",
      "config": {
        "rect": [80, 220, 80, 80]
      }
    },
    {
      "module": "Wind",
      "config": {
        "rect": [160, 220, 80, 80]
      }
    },
    {
      "module": "Clock",
      "config": {
        "rect": [320, 220, 160, 60]
      }
    },
    {
      "module": "Location",
      "config": {
        "rect": [320, 280, 160, 20]
      }
    }
  ]
}
```


# 動作状況

自動でサービス起動するようになっているので、再起動を行うと起動後にこのように画面表示がされます。

![キャプションを入力できます](https://camo.elchika.com/b586e048b158388102805faf4c3f8a1acb292881/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f34393935333530662d366133382d346138352d626235382d313366643738656163363433/)


天気のアイコンを以下のサイトから入手して変更してみました。
[OpenWeahther](https://github.com/Bodmer/OpenWeather)

![キャプションを入力できます](https://camo.elchika.com/a95685f112977405b8289c3b803f6c36e5816548/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f32323865396463622d313162302d346330622d393738352d393461346336396262326433/)

無線LANのパワーセーブのタイミングとバッティングするのか、起動直後にwaiting dataで天気情報が表示されないことがありました。
一旦以下ファイルを開き
```
sudo nano /etc/init.d/WeatherPi
```

変更前
```
do_start () {
    log_daemon_msg "Starting system $DAEMON_NAME daemon"
    start-stop-daemon --start --background --pidfile ${PIDFILE} --make-pidfile --user ${DAEMON_USER} --chuid ${DAEMON_USER} --startas ${DAEMON} -- ${DAEMON_OPTS}
    log_end_msg $?
}
```
変更後(Sleepを入れました)
```
do_start () {
    sleep 20
    log_daemon_msg "Starting system $DAEMON_NAME daemon"
    start-stop-daemon --start --background --pidfile ${PIDFILE} --make-pidfile --user ${DAEMON_USER} --chuid ${DAEMON_USER} --startas ${DAEMON} -- ${DAEMON_OPTS}
    log_end_msg $?
}
```
として様子を見ています。

2024/9/14
OpenWeatherMapのAPI 2.5が廃止になり、3.0を利用することにしました。
WeatherPi.pyの以下を変更することで対応できました。

変更前
```
        resopnse = requests.get(
            "https://api.openweathermap.org/data/2.5/onecall" +
            "?appid={}&lat={}&lon={}&lang={}&units={}".format(
                appid, latitude, longitude, language, units))
```
変更後
```
        resopnse = requests.get(
            "https://api.openweathermap.org/data/3.0/onecall" +
            "?appid={}&lat={}&lon={}&lang={}&units={}".format(
                appid, latitude, longitude, language, units))
```

2024/12/15
電源スイッチを付けました。

```
sudo nano /boot/config.txt
```
以下を張り付けることで、5秒間のボタン長押しでシャットダウンします。電源落とすときにSSHでつながなくてよいので便利です。
```
dtoverlay=gpio-shutdown,debounce=5000
```


# 参考リンク

こちらが、元祖のウエザーステーションソフトウエアです。
[WeatherPi_TFT](https://github.com/LoveBootCaptain/WeatherPi_TFT)

こちらは、上記のフォークで独自に改良をされた方の物です。日本語対応もされているので、今回はこちらを利用致しました。
[WeatherPi](https://github.com/miyaichi/WeatherPi)

日本語フォントのインストール方法
[ゴシックも明朝もラズパイのフォントはNoto CJK jpでスッキリ統一！](https://www.fabshop.jp/%E3%82%B4%E3%82%B7%E3%83%83%E3%82%AF%E3%82%82%E6%98%8E%E6%9C%9D%E3%82%82%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%AE%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AFnoto-cjk-jp%E3%81%A7%E3%82%B9%E3%83%83/)

無線LANのパワーセーブ無効化
[PC​/RaspberryPi​/Linuxを動かしてみる​/オンボードWiFiが切れないようにする](https://yueno.net/xoops/modules/xpwiki/?PC%2FRaspberryPi%2FLinux%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B%2F%E3%82%AA%E3%83%B3%E3%83%9C%E3%83%BC%E3%83%89WiFi%E3%81%8C%E5%88%87%E3%82%8C%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)

RaspberryPiにshutdownボタンを付けよう
https://monomonotech.jp/kurage/raspberrypi/shutdown_button.html

# 最後に


一旦はフリーで公開されているウエザーステーションを利用させていただき、動作確認もかねて構築しました。
今後の予定としては、BLEセンサーからのIoTデータ取り込み(&クラウドへのゲートウエイー)と表示機能を持たせる予定です。