Armadilloフォーラム

A6のSleep起床トリガによる処理について

richard84

2021年4月14日 15時53分

お世話になります。

Armadillo-IoT A6を用いて間欠動作によるデモシステムを作成しております。
デモシステムは、概略ですが以下の流れを考えております。

Sleep -> 起床(SMS/RTC/SW1) -> センサ値取得 -> クラウド送信 -> Sleep

上記のように起床をトリガにセンサ値取得動作をさせたいのですが、どのようにすれば良いでしょうか。
通常のブートですと、サービスとして自動起動させると思います(古いやり方だとrc.localとか)。
サービスとして何らかのプロセスを動かしておいて、タイマと"/sys/power/wakeup_count"を組み合わせれば実現できそうなイメージは持っております。

製品の特長からすると、何らかのやり方があると思っていますが、いかがでしょうか。
(製品マニュアルからは見つけられませんでした...)

以上、宜しくお願い致します。

コメント

at_mitsuhiro.yoshida

2021年4月15日 11時27分

吉田です。

今後 Howto などを充実させていきたいと考えております。

色々実現手段はあると思いますが、2 通り記載します。

1 つはそのまま処理を継続させる方法と、
もう 1 つは systemd の機能を使用する方法です。

(1) そのまま処理を継続する。
以下の様にスリープ実施後、起床時の動作を記載します。

#!/bin/sh
 
get_sensor_data() {
    echo "get sensor data"
}
 
send_data() {
    echo "send data"
}
 
while true
do
    # 起床要因設定 RTC 300秒後に起床
    aiot-set-wake-trigger rtc enabled +300
 
    # sleep 実施
    aiot-sleep
    # aiot-sleep-sms # SMS もトリガーに含める場合
 
    # 以下起床後の処理です
    # データ取得
    get_sensor_data
 
    # クラウドに送信
    send_data
done

(2) systemd の機能を使用する。
参考 URL:
- https://askubuntu.com/questions/226278/run-script-on-wakeup
- https://wiki.archlinux.org/index.php/Power_management#Hooks_in_.2Fusr.2…

例えば以下の様に設定します。

/lib/systemd/system-sleep/exsample.sh を作成(他のファイル名でも構いません。)

#!/bin/sh
case $1/$2 in
  pre/*)
    echo "hoge: Going to $2..."
    # ここに sleep に入る前に実行する処理を記載します。
    ;;
  post/*)
    echo "hoge: Waking up from $2..."
    # ここに 起床後実行する処理を記載します。
    ;;
esac

/lib/systemd/system-sleep/exsample.sh に実行権限を付与します。

root@armadillo:~# chmod a+x /lib/systemd/system-sleep/exsample.sh

/lib/systemd/system/root-sleep.service を作成。
(root として実行する場合この名前になります。他のユーザーとして実行する場合はファイル名が変わります。)

  1 [Unit]
  2 Description=%I sleep hook
  3 Before=sleep.target
  4 StopWhenUnneeded=yes
  5
  6 [Service]
  7 Type=oneshot
  8 RemainAfterExit=yes
  9 ExecStart=-/usr/bin/systemctl stop %i
 10 ExecStop=-/usr/bin/systemctl start %i
 11
 12 [Install]
 13 WantedBy=sleep.target

定義したサービスを起動します。

root@armadillo:~# systemctl enable root-sleep.service

以下確認手順です。

Sleep します。

root@armadillo:~# aiot-sleep
aiot-sleep: Power Management suspend-to-ram
[ 2961.610969] PM: suspend entry (deep)
[ 2961.614671] PM: Syncing filesystems ... done.
[ 2961.634140] Freezing user space processes ... (elapsed 0.001 seconds) done.
[ 2961.642402] OOM killer disabled.
[ 2961.645700] Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done.
[ 2961.654342] Suspending console(s) (use no_console_suspend to debug)

SW1 押すと起床します。

[ 2961.773932] OOM killer enabled.
[ 2961.777121] Restarting tasks ... done.
[ 2961.799520] PM: suspend exit
aiot-sleep: change mode CPU Idle

以下のコマンドを実施すると、実行結果が表示されます。

root@armadillo:~# journalctl -b -u systemd-suspend
-- Logs begin at Thu 2021-04-15 10:12:15 JST, end at Thu 2021-04-15 10:32:51 JST. --
Apr 15 10:24:23 armadillo systemd[1]: Starting Suspend...
Apr 15 10:24:23 armadillo systemd-sleep[661]: hoge: Going to suspend...
Apr 15 10:24:23 armadillo systemd-sleep[661]: Suspending system...
Apr 15 10:24:29 armadillo systemd-sleep[661]: System resumed.
Apr 15 10:24:29 armadillo systemd-sleep[661]: hoge: Waking up from suspend...
Apr 15 10:24:29 armadillo systemd[1]: systemd-suspend.service: Succeeded.
Apr 15 10:24:29 armadillo systemd[1]: Started Suspend.

richard84

2021年4月19日 22時39分

吉田様

ご回答ありがとうございます。

(1)の手法については、動作させることができました。

(2)のsystemdを使用するやり方について、頂いたやり方をもとに試してみましたが確認できませんでした。
(すみません、以下ちょっと長いです)

> (2) systemd の機能を使用する。

> /lib/systemd/system/root-sleep.service を作成。
> (root として実行する場合この名前になります。他のユーザーとして実行する場合はファイル名が変わります。)

私のこれまでの理解ですと、ユニットファイル中に実行ファイル名を記述しますが、このやり方は、sleep動作前後で"/lib/systemd/system-sleep/"にあるスクリプトが自動的に実行されると理解しましたが、正しいでしょうか。

サービス定義後、起動しSleep=>SW1によるWakeupを行いましたが、実行結果が空でした。
なにか、設定が不足していますでしょうか。

・/lib/systemd/system-sleep/example.sh

root@armadillo:~# cat /lib/systemd/system-sleep/example.sh
#!/bin/sh
echo "Call example.sh..."
case $1/$2 in
    pre/*)
        echo "hoge: Going to $2..."
        # ここに sleep に入る前に実行する処理を記載します。
        /home/atmark/test/red_led_flash.sh
        ;;
    post/*)
        echo "hoge: Waking up from $2..."
        # ここに 起床後実行する処理を記載します。
        /home/atmark/test/green_led_flash.sh
        ;;
esac

・/lib/systemd/system/root-sleep.service

root@armadillo:~# cat /lib/systemd/system/root-sleep.service
[Unit]
Description=%I sleep hook
Before=sleep.target
StopWhenUnneeded=yes
 
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=-/usr/bin/systemctl stop %i
ExecStop=-/usr/bin/systemctl start %i
 
[Install]
WantedBy=sleep.targetroot@armadillo:~# ls -l /lib/systemd/system/root-sleep.service
-rw-r--r-- 1 root root 226 Apr 15 18:53 /lib/systemd/system/root-sleep.service

・journalctl -b -u systemd-suspendの実行

root@armadillo:~# [  792.300638] fec 2188000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
journalctl -b -u systemd-suspend
-- Logs begin at Thu 2019-02-14 19:12:00 JST, end at Mon 2021-04-19 22:07:48 JST
-- No entries --

・systemctl status root-sleepの結果(参考)

root@armadillo:~# systemctl status root-sleep        
● root-sleep.service -  sleep hook
   Loaded: loaded (/lib/systemd/system/root-sleep.service; enabled; vendor prese
   Active: inactive (dead)
 
Apr 19 22:00:13 armadillo systemd[1]: Stopped  sleep hook.
Apr 19 22:01:37 armadillo systemd[1]: Starting  sleep hook...
Apr 19 22:01:37 armadillo systemctl[762]: Failed to mangle name: Invalid argumen
Apr 19 22:01:37 armadillo systemctl[762]: Failed to expand names: Invalid argume
Apr 19 22:01:37 armadillo systemd[1]: Started  sleep hook.
Apr 19 22:01:37 armadillo systemd[1]: Stopping  sleep hook...
Apr 19 22:01:37 armadillo systemctl[763]: Failed to mangle name: Invalid argumen
Apr 19 22:01:37 armadillo systemctl[763]: Failed to expand names: Invalid argume
Apr 19 22:01:37 armadillo systemd[1]: root-sleep.service: Succeeded.
Apr 19 22:01:37 armadillo systemd[1]: Stopped  sleep hook.

以上、よろしくお願いします。

at_mitsuhiro.yoshida

2021年4月20日 14時41分

吉田です。

systemctl enable root-sleep.service

は実行されてますでしょうか。

richard84

2021年4月20日 14時57分

吉田様

お世話になります。

> systemctl enable root-sleep.service

> は実行されてますでしょうか。

はい、実行しております。
そのうえで、Sleep=>Wakeup動作後"journalctl"の結果が"-- No entries --"のため、サービスのステータス確認を試してみました。

以上、宜しくお願いします。

at_mitsuhiro.yoshida

2021年4月26日 17時46分

吉田です。

確認不足の内容が幾つかありました。
申し訳ありません。

まず、
> /lib/systemd/system/root-sleep.service を作成。
に関しては作成不要です。

Debian パッケージ ems31-uitls の aiot-sleep では、

echo mem > /sys/power/state

を実行することで Suspend-to-RAM 状態へ遷移しておりますが、
この処理 /usr/bin/aiot-sleep の 47行目 を

systemctl suspend

に書き換えていただき、aiot-sleep 実行後に、

root@armadillo:~# journalctl -b -u systemd-suspend

を実行いたしますと、実行結果が表示されるかと思われます。

ご確認よろしくお願いします。

richard84

2021年4月26日 22時42分

吉田様

教えて頂いた手順で、systemctlによりsleep前後で任意処理の動作確認ができました。
できるだけ、システムの機能を使用したほうが良いと考えますので、こちらの手法で進めたいと思います。

色々、ご教示いただきありがとうございました。

以上、宜しくお願い致します。

at_keitaro.takahashi

2021年6月1日 17時34分

アットマークテクノ高橋です。

2021/05/31実施の製品アップデートにて、
aiot-sleep 内で Suspend-to-RAM に遷移するコマンドを、デフォルトで

systemctl suspend

に変更しました。
これにより、 /lib/systemd/system-sleep/ に配置したスクリプトが自動で実行されるようになります。
詳細は

Armadillo 製品アップデートのお知らせ (2021年05月/Armadillo-IoT A6対象)
https://armadillo.atmark-techno.com/news/20210531/software-update-aiota6

及び、

Armadillo-IoT ゲートウェイ A6 製品マニュアル「7.5. スリープモードへの遷移・起床時にスクリプトを実行する」
https://manual.atmark-techno.com/armadillo-iot-a6/armadillo-iota6_produ…

をご確認ください。