SigfoxとRaspberry Piで、狩猟の罠通知装置を作成する。（その２）


# 続編
　前回の[狩猟の罠通知装置を作成する。（その１)](https://qiita.com/SAMisnotMydog/items/f186724821a3537d228e)の続きです。
RaspberryPi3ModelB（３B）での動作が確認できたところで力尽きましたので、その続きです。
今回はRaspberryPiZeroＷ（ZeroＷ）で本番環境を構築します。
# お品書き
0. GPIOからの電源供給
0. ZeroWへの移植
    - シリアルコンソールの無効化
    - UARTの設定
0. プログラムの自動起動化
    - Unitファイルの記述
    - pyファイルへの実行権限の付与
0. メール通知の設定
0. ひとまず完成
です。
## GPIOからの電源供給
　ラズパイへの電源供給ですが、普段はUSB端子にACアダプターを繋ぎますが、屋外にはコンセントがありません。
携帯電話用のバッテリーからの給電を想定していますが、USBコネクタがバッテリー側がType-A、ラズパイ側はMicro-BなのでUSBの変換ケーブルが必要となりました。
変換ケーブルを買う必要があるのならば、いっそのことGPIOから給電してしまえばと、USB⇆GPIOコードを購入しました。
　実は、GPIOから給電すればUSB端子が２つ使えると信じていたのですが、片方は電源供給専用なんですね、知りませんでした。

　ジャンパケーブルの接続図を作っておきました。
３点スイッチのトップとダウンを勘違いしていたところがあったので、配線とプログラムを見直してあります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253252/69807359-7f20-89b9-a56d-0869accc6717.png" width=50%>

## ZeroWへの移植
### シリアルコンソールの無効化
 3Bでテストした環境をラズパイZeroに再現します。
手順は同じで、ラズパイの設定画面でシリアルコンソールを無効にします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253252/de5c704d-62d8-05e3-251e-3d07e2229d90.png" width=80% >

 ### UARTの設定
　ZeroWも遅い方（MiniUART）をシリアルポートに、早い方（PL011）をそのままBluetoothに使います。
3Bと同様に　/boot/cmdline.txt に`enable_uart=1`と`core_freq=250`を追加します。
 ```bash:コンソール
pi@zero:~ $ cat /boot/cmdline.txt
console=tty1 root=PARTUUID=884581db-02 rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
pi@zero:~ $ sudo vi /boot/cmdline.txt
pi@zero:~ $ cat /boot/cmdline.txt
console=tty1 root=PARTUUID=884581db-02 rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles enable_uart=1 core_freq=250
```
追加できました。

　確認します。
```bash:コンソール
pi@zero:~ $ ls -l /dev/serial*
lrwxrwxrwx 1 root root 5  3月 23 07:17 /dev/serial0 -> ttyS0
lrwxrwxrwx 1 root root 7  3月 23 07:17 /dev/serial1 -> ttyAMA0 
```
オッケーです。多分。
## プログラムの自動起動化
　屋外の設置場所にはディスプレイはもちろんありません。
現場で電源に接続したらプログラムが自動で走るようにしておく必要があります。
　systemdを使って自動起動する方法が推奨とのことなので、Unitファイルに起動したいコマンドを記述して自動起動となります。なるそうです。

https://qiita.com/karaage0703/items/ed18f318a1775b28eab4

を参考にいたしました、ありがとうございます、勉強になります。

Unitファイルの名前はsendmsg.serviceとしました。
```bash:/lib/systemd/system/sendmsg.service
[Unit]
Description = sendmsg

[Service]
ExecStart=/usr/bin/python3 /home/pi/sendmsg.py
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target
```
有効化しておきます。
```bash:コンソール
pi@zero:~/dev $ sudo systemctl enable sendmsg.service
Created symlink /etc/systemd/system/multi-user.target.wants/sendmsg.service → /lib/systemd/system/sendmsg.service.
pi@zero:~ $ 
```
ちなみに無効化は`sudo systemctl disable sendmsg.service`です。
　pythonの実行ファイルは前回から少し修正してあります。
スイッチの動作で割り込みして通知することも考えたのですが、リアルタイムで獲物がかかった通知が来ても、どうせ深夜遅くや早朝なので、アクションを起こす必要もなく現実的ではないので、１時間おきの状況の報告にとどめてあります。
どちらかというと、昼間のメール送信を止めるようにしたほうが良いのかとも思いますが、Sigfoxはパケット料が掛かったり、制限がされたりといったことがないので、そのままにしておきます。
```python:/home/pi/sendmsg.py
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time
import subprocess
import serial

port = '/dev/ttyS0'
top_input = 23
bottom_input = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(top_input, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(bottom_input, GPIO.IN, pull_up_down=GPIO.PUD_UP)

try:
    while True:
       
        top_state = GPIO.input(top_input)
        bottom_state = GPIO.input(bottom_input)    
        
        if top_state == False:
            switch_position = "0100"   
        elif bottom_state == False:
            switch_position = "0000"
        else:
            switch_position = "1100"

        temp = subprocess.run('vcgencmd measure_temp', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout.split('=')
        volt = subprocess.run('vcgencmd measure_volts', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout.split('=')
        temp = temp[1].replace("'C",'').replace('\n','')
        volt = volt[1].replace("V",'').replace('\n','')
        message = switch_position+temp.split(".")[0].zfill(4)+ temp.split(".")[1].ljust(4,'0') + volt.split(".")[0].zfill(4)+ volt.split(".")[1].ljust(4,'0')
        
        s = serial.Serial(port, 9600, timeout=10)
        at_command = 'AT$SF={0}\r'.format(message)
        s.write(at_command.encode())
        resp = s.readline()
        #print(temp + volt)
        #print('Response: {}'.format(resp))
        time.sleep(6)#1h=3600

except KeyboardInterrupt:
    GPIO.cleanup()
```
　自動起動させるために頭にシバン`#!/usr/bin/env python3`をつけておく必要があります。
あとパーミッションを変更して実行権限を付与しておきます。
```bash:コンソール
pi@zero:~ $ ls -al
-rw-r--r--  1 pi pi 1465  3月 22 22:45 sendmsg.py
pi@zero:~ $ chmod 755 sendmsg.py
pi@zero:~　$ ls -al
-rwxr-xr-x  1 pi pi 1465  3月 22 22:45 sendmsg.py
pi@zero:~ $ 
```
（他のファイルは一覧から消してあります。）

## メール通知の設定
　またここは京セラさんの記事を見ながら設定していきます。

https://qiita.com/ghibi/items/53259381a30363538a6d

Sigfoxの管理画面から設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253252/55b8a3a7-a17d-7b7e-a26d-4ccdddfc6f8b.png">
初めの４桁がスイッチの状態、次の４桁＋４桁がCPU温度、次の４桁＋４桁がCPU電圧なので、Custom payload configを`switch::int:16 temp1::int:16 temp2::int:16 volt1::int:16 volt2::int:16`
と設定しました。
メッセージ欄で`switch:"{customData#switch}"
temp:"{customData#temp1}.{customData#temp2}'C"
volt:"{customData#volt1}.{customData#volt2}V"`と入力して小数点表示をさせます。
前回手こずったのと比較すると、サクサク進んでいます。
## ひとまず完成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253252/6fc7fa78-5583-7144-4c5c-9786147061f6.jpeg">
　USBバッテリーに接続して朝まで動作確認です。
１回目のメールが送られているのを、Sigfoxの管理画面から確認して寝ました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253252/5f115d18-1512-6613-3dd2-11e3b5a460eb.png" width=30% >
朝起きると１時間おきにメールが届いていました。
メールの本文は、

```
送信テスト
{
  device:"72E4CC",
  time:"1648039738",　　
  data:"01000036300000013500"
switch:"256"
temp:"54.12288'C"
volt:"1.13568V"
}
```
と送られて来ています。
１０進法を１６進法に変換せずに送信しているので、メールでの送信時には１６進から１０進に変換されて、送信した数値とは異なってしまっていますが、まぁよしとしましょう、成功ですね。
## でもまだ続けます。
　猟期ももう終わることですし、フィールドのテストは次の機会ということで、ここまでで一区切りです。
とはいいつつ、このままでは実用的ではないので、スマートフォンから設定が出来るとか、罠の位置をマップで表示するとか、消費電力を抑えるなどの工夫が必要になってくると思いますので、時間を見つけては来シーズンの本格運用に向けて改良をしていくつもりです。
　お付き合いいただきありがとうございました。