伝説のSpice特別企画 いまさらIOT
Node Express 自動起動
【伝スパ】xbeeIOT_自動起動とワンボタンシャットダウン
このIOTシステムは最終的にコンソールも表示装置もありません。 電源を入れると自動的にNodeプログラムが起動する必要があります。 起動したことを示すLEDもあります。
逆にlinuxでは直接電源を切ることはファイルを壊すことにつながるので出来ません。 システムシャットダウンのスイッチが必要です。 このスイッチは回路図ではxbeeのリセットスイッチに接続されているラインです。 短い時間で押された場合xbeeのリセットになります。 長い時間押されるとシステムシャットダウンになります。 長く押すと、やがてraspberry-piの小さな緑のLEDが点滅します。 そうなったらスイッチを放しても大丈夫です。 プログラム実行中の赤いLEDが消えるまで押し続けても構いません。 最終的にraspberry-piの小さな緑のLEDは消灯します。 その時点でOFFが完了になっています。
電源は入ったままですのでxbeeのLED等は点灯しています。 この状態で安全に電源コードを抜いて完全オフにできます。
次起動するときは新たに電源ケーブルをつなぐと起動しますが、上記で電源コードを抜く前でもxbeeリセットスイッチ(シャットダウンスイッチ)を押すと再起動します。 これはraspberry-piの基本機能ですので設定を何もしなくても機能します。
プログラム実行LEDの点灯
nodeプログラムが実行されるとLEDが点灯する機能はすでに今回のプログラムに入っています。 コンソールからコマンドで起動しても点灯します。
forever インストール
まず forever プログラムを準備します。 パスは作業エリアに入っておきます
cd xbeeIOT/robo
sudo npm install -g forever
グローバルな位置にパッケージをロードします。
起動してみる
一度起動してみましょう
forever start --append -l xbeeIOT.log --minUptime=10000 --spinSleepTime=1000 /home/pi/xbeeIOT/robo/bin/www
forever を停止する
forever を強制停止したいときは起動している forever を確認します。 最初の一つだけなので番号’0’になっていると思います。 listで確認 番号’0’を強制停止です。
forever list
forever stop 0
プログラムの自動起動
プログラムの自動起動はrc.localを使用しますが、その前に長い起動コマンドをスクリプトにします。
rootに戻ってautoxbeeIOT.shファイルを作成します
cd ~
nano autoxbeeIOT.sh
内容は
#!/bin/sh
forever start --append -l xbeeIOT.log --minUptime=10000 --spinSleepTime=1000 /home/pi/xbeeIOT/robo/bin/www
ファイルを閉じたら、そのファイルに実行権限を与えます。
sudo chmod +x autoxbeeIOT.sh
rc.localに登録します。
sudo nano /etc/rc.local
すでにこのファイルはDNSの起動保障のためのコードが入っていますのでその下、一番最後に exit() 文がありますのでその間に書きます。
sudo -u pi /home/pi/autoxbeeIOT.sh
正しく実行されるか確認
sudo /etc/rc.local
これで Raspberry-pi 起動後 rc.local 起動タイミングで autoxbeeIOT.sh が実行され forever が nodeプログラム robo/bin/www を起動するという手順です。
参考
Raspberry
Piでプログラムを自動起動する5種類の方法を比較・解説
シャットダウン処理
スイッチによるシャットダウン処理はpythonで記述します。 手順は起動時にデーモンとしてシャットダウンスイッチを常にモニタして押されたらシャットダウン処理に入るプログラムを作成します。
処理ファイルは /home/pi に shutdownd.py を作ります。
(note)この処理を紹介していますサイトでは gpio readall コマンドを使用しています。 私のところではどこかで apt-get のミスをしたのか wiringpi が削除されていてコマンドがなくなっていました。 そのような方は下記で復旧してください。 gpio readall が動作する方は不要処理です。
sudo apt-get purge wiringpi
sudo apt-get install wiringpi
シャットダウンファイルの新規作成編集から始めます。
参考
ラズパイでシャットダウンボタンを付ける(ついでに起動ボタン)
この資料のgpioポート番号を3番ピンに変更して使用します。 詳しくは参考サイトを見てください。
nano shutdownd.py
ファイルの中身は
#!/usr/bin/python
# coding:utf-8
import time
import RPi.GPIO as GPIO
import os
pinnumber=3
GPIO.setmode(GPIO.BCM)
#GPIO3pinを入力モードとし、pull up設定とします
GPIO.setup(pinnumber,GPIO.IN,pull_up_down=GPIO.PUD_UP)
while True:
GPIO.wait_for_edge(pinnumber, GPIO.FALLING)
sw_counter = 0
while True:
sw_status = GPIO.input(pinnumber)
if sw_status == 0:
sw_counter = sw_counter + 1
if sw_counter >= 50:
print("長押し検知!")
os.system("sudo shutdown -h now")
break
else:
print("短押し検知")
break
time.sleep(0.01)
print(sw_counter)
実行権限を与えます。
sudo chmod +x shutdownd.py
このデーモンを起動するシステムサービスを作成します。
ファイル shutdownbuttond.service を新しく作成します。
sudo mkdir /usr/lib/systemd/system
sudo nano /usr/lib/systemd/system/shutdownbuttond.service
ファイルの中身は
[Unit]
Description=Shutdown Daemon
[Service]
ExecStart =/home/pi/shutdownd.py
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
そししてこのサービスを有効にします。
sudo systemctl enable shutdownbuttond.service
リブートしないで起動してみる
sudo service shutdownbuttond start
サービスが有効になったか確認
systemctl status shutdownbuttond
これでボタンを長く押すとシャットダウン処理に入ります。