Raspberry Piのオーディオ専用ディストリ”moode audio“。
それに温度記録の機能を追加しようとしたけれど、ジョブを定期実行させるcronが動いてない事が判明。
そこでcrondの追加ではなく、Debianらしくsystemdのtimerを使って同様の処理をKickさせます。
使っているmoode audioのVersionはRelease 4.4 2018-12-09。
やりたかった事
家の赤外線リモートコントローラをNode-Redで動かしていたRPi2がお役御免になりまして。
それに残っていた温度ロギングを使用頻度の低いmoode audioマシンに移そう、としたのが事の始まり。
HiFi-DAC HATにAM2302をはんだ付け。GPIO18経由でデータを取得します。
cronは動いてない
当初は今まで通りのcronで回せばいいやと思っていました。
しかしプロセスを確認してみると、crondがそもそも実行されていない。
# ps aux | grep cron
root 27061 0.0 0.4 4360 1908 pts/0 S+ 00:50 0:00 grep cron
そしてsystemctlのサービス一覧にもありません。
# systemctl | grep -i cron
#
crondはインストールされているけれど、どうやって起動させればいいのか。
systemdで動かすのが今風らしい
調べてみると、以下の事がわかりました。
- moode audioはcronを止めており、それを動かすと他の定期実行が止まるらしい
- debianはcrond以外にもsystemdのタイマーにてジョブを定期実行できる
これについては以下のサイトが参考になりました。
手順については概ね参照サイト通りです。
.serviceファイルの作成
まずコマンドを記述する.serviceファイルを作成。
フォルダパスは/lib/systemd/systemでした。
# vi /lib/systemd/system/am2302.service
[Unit] Description = am2302 temp and humidity uploader [Service] Type = oneshot ExecStart = /usr/local/etc/Adafruit_Python_DHT/sensor/am2302_2_m2x.sh 2>&1 | logger -t am2302_2_m2x -p local0.info
.timerファイルの作成
次に実行タイミングを指定する.timerファイルの作成。
# vi /lib/systemd/system/am2302.timer
[Unit] Description = am2302 temp and humidity uploader [Timer] OnCalendar = *-*-* *:1/10:00 [Install] WantedBy=timers.target
OnCalenderにcronと同様、実行タイミングを書き込みます。
*はワイルドカードなので、「*-*-* *:1/10:00」は10分ごとに実行の設定。
適用
ファイルを作成したら、リロードして読み込ませ
#systemctl daemon-reload
その後サービスをEnableにします。
シンボリックリンクが貼られました。
# systemctl enable am2302.timer
Created symlink /etc/systemd/system/timers.target.wants/am2302.timer → /lib/systemd/system/am2302.timer.
確認
無事有効化できれば、ジョブのステータスをコマンドで確認できるようになります。
これはcronには無い便利機能。
# systemctl status am2302.timer
● am2302.timer - am2302 temp and humidy uploader
Loaded: loaded (/lib/systemd/system/am2302.timer; enabled; vendor preset: ena
Active: active (waiting) since Mon 2020-02-03 01:08:01 JST; 4s ago
Feb 03 01:08:01 moode2F systemd[1]: Started am2302 temp and humidity uploader.
journalctlコマンドにてログも見れます
# journalctl -u am2302
-- Logs begin at Sun 2020-02-02 17:24:52 JST, end at Mon 2020-02-03 01:08:07 JST
Feb 03 00:48:11 moode2F systemd[1]: Starting am2302 temp and humidity uploader...
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]: 36.2,20.8
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]: % Total % Received % Xferd
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]:
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]: [237B blob data]
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]: HTTP/1.1 202 Accepted
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]: Content-Type: application/json;
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]: X-M2X-VERSION: v2.112.2
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]: Vary: Accept-Encoding
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]: X-RateLimit-Limit: 5
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]: X-RateLimit-Remaining: 4
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]: X-RateLimit-Reset: 1580658495
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]: Content-Length: 21
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]: [1B blob data]
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]: {"status":"accepted"} % Total
Feb 03 00:48:14 moode2F am2302_2_m2x.sh[26929]:
Feb 03 00:48:15 moode2F am2302_2_m2x.sh[26929]: [158B blob data]
Feb 03 00:48:15 moode2F am2302_2_m2x.sh[26929]: HTTP/1.1 202 Accepted
Feb 03 00:48:15 moode2F am2302_2_m2x.sh[26929]: Content-Type: application/json;
Feb 03 00:48:15 moode2F am2302_2_m2x.sh[26929]: X-M2X-VERSION: v2.112.2
Feb 03 00:48:15 moode2F am2302_2_m2x.sh[26929]: Vary: Accept-Encoding
Feb 03 00:48:15 moode2F am2302_2_m2x.sh[26929]: X-RateLimit-Limit: 5
これでmoode audio+温度記録が一台のラズパイで済みます。
測定結果をM2Xでグラフ化する手法などは以下を御覧ください。