ATOM Cam 2 / ATOM Cam Swing で atomcam_tools を試してみたメモ

# はじめに

いまさらですが、ATOM Cam 2と ATOM Cam Swingを買ってみました。
atomcam_toolsを試したメモを残しておきます。

https://www.atomtech.co.jp/

# iOSアプリ「ATOM - スマートライフ」をインストールする

メールアドレスを入力しても認証コードが届かないなー、と思っていたら、操作が足りていませんでした。
メールアドレスを入力し、ライセンスに同意して、「認証コード取得」を押す必要がありました。
同じように悩まれている方の参考になれば幸いです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/4e494cef-93d7-52ce-891f-88717b076168.jpeg" width="50%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/6ed34484-c334-5ebb-5f83-bd8fbf5de243.jpeg" width="50%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/1a5cc1fb-7955-9940-4587-2ea560802bfd.jpeg" width="50%">

# iOSアプリへATOM Cam 2 / ATOM Cam Swingの登録

画面の指示に従って操作すればカメラの登録、Wi-Fiの設定は難しくありませんでした。

- RESETボタンの長押しでカメラを待機状態(Bluetooth ON)にし、アプリからカメラを発見
- スマホに表示されるQRコードをカメラに見せることでWi-Fiの接続情報を設定

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/d1d7ae0f-2cc5-4c7e-41e9-64d00487e2f5.png" width="50%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/93c218bc-59e6-11c1-0fd5-d8aea112f5b4.jpeg" width="50%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/545563e0-3d2f-1cd3-047e-ffd9a8f8c5dc.png" width="50%">

# 消費電力

ATOMアプリでカメラをOFFにしていても、消費電力はあまり変わりませんでした。
(常に組み込みLinuxが動作している状態。起動時:0.28A 〜 停止時:0.23A)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/3e510536-747a-8a50-c48f-c2306e95a77b.jpeg" width="50%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/84e713ac-416e-aee0-d7fe-b71742e5580f.jpeg" width="50%">

# atomcam_tools

ATOM Camを拡張するツールキットを導入します。

https://github.com/mnakada/atomcam_tools

使用法に記載のとおり、zipファイルを解凍して、SDカードへコピーします。
リモートからSSHログインできるようにするため、解凍したファイルの中のauthorized_keysファイルにSSHの公開鍵を追記します。

例. macOSの場合

id_rsa.pubの内容をauthorized_keysファイルへコピー&ペーストします。

```bash
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDN6gNVKw2XBsk/uF5Gv...
(以下、省略)
```

## SSHログイン

ATOM CamのIPアドレスを確認し、sshコマンドでリモートログインできることを確認します。

例. masOSの場合

```bash
$ ssh root@192.168.3.7
[root@atomcam:~]# 
```

### 2024.1.20 追記

Sonoma 14.2.1でTerminalからATOM CamへSSHログインしたところエラーになりました。
sshクライアントのssh-rsaを有効化する必要があることがわかりました。

```bash
$ ssh -o PubkeyAcceptedKeyTypes=ssh-rsa root@192.168.3.7
```

(参考)
https://pakapaka.jp/no-mutual-signature-algorithm/

## ウェブ管理画面

ブラウザからATOM CamのIPアドレスへアクセスすると、ウェブ管理画面が表示されます。

![web_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/6a64f09e-56e7-b22e-4d81-e5794e1ccb5d.jpeg)

## RTSPストリーミング表示

ATOM Cam2は公式でRTSPストリーミング機能がサポートされましたが、ATOM Cam Swingは未サポートのため、atomcam_toolsの機能を利用するメリットがあります。(ATOM Cam2は公式、atomcam_toolsのどちらも利用できました)

### 公式の場合(ATOM Cam2のみ)

ATOMアプリを操作してRTSP機能を有効にします。

対象のデバイスを選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/4b0d9832-e65f-2406-7674-56a1a59634a0.png" width="50%">

右上の歯車マークを選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/4fc3feb5-0497-907d-e132-077ee7c5108f.png" width="50%">

「その他」を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/d83615ee-ca46-ca77-4dcf-842aabeac54a.png" width="50%">

「PCで再生」を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/5585f4fe-3436-4132-76f6-1be5d17d98f2.png" width="50%">

URLが表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/cfe692fe-11e5-b669-781d-2e6e60657e18.png" width="50%">

ATOM Cam Swingの場合、「PCで再生」メニューが表示されません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/e41e6658-bcef-5bd9-ffa9-99f8d70af72a.png" width="50%">

### atomcam_toolsの場合

ウェブ管理画面からRTSP(Main)を有効(スライドボタンを右へ移動)にすると、URLが表示されます。

### VLC Playerでの表示

URLを入力すると画面が表示されます。

例. atomcam_toolsのURLを入力した場合

![rtsp_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/998e89bb-be07-c08b-e01a-73676b3e0656.jpeg)

### 静止画の保存

ffmpegコマンドで静止画を保存する方法です。output.jpgというファイル名で保存されます。

![スクリーンショット 2023-01-02 22.13.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/53f21788-2555-5802-df13-2365e95e5c5b.png)

例. 公式のURLを指定した場合

```bash
$ ffmpeg -loglevel error -i rtsp://1781:9015@192.168.3.7/live -f image2 -frames:v 1 output.jpg
```

![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/62c597f8-4594-06b7-c948-798b1d308d88.jpeg)

### YouTubeLive配信

ffmpegコマンドでYouTubeLiveへ配信する方法です。

![スクリーンショット 2023-01-02 22.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/8d477db0-a12b-53b3-ce0b-329d9c842632.png)

例. 公式のURLを指定した場合

```bash
$ ffmpeg -loglevel error -i rtsp://1781:9015@192.168.3.7/live -ar 44100 -f flv rtmp://a.rtmp.youtube.com/live2/[ストリームキー]
```

![youtube_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/f7a19bb4-87df-cb46-c6a8-1084ea3d23e7.jpeg)

## 音声を再生する方法

こちらの方法でWAVファイルをATOM Camのスピーカーから再生することが可能です。
ただし、対応しているWAVファイルのフォーマットはサンプリングレート(16bit, 8kHz)のモノラルWAV形式である必要があります。

https://github.com/mnakada/atomcam_tools/issues/23

### WAVファイルを用意する

効果音ラボの「ラッパのファンファーレ」を使用させていただきました。

https://soundeffect-lab.info/sound/anime/mp3/trumpet1.mp3

ffmpegコマンドでフォーマットを変換します。

```bash
$ ffmpeg -i trumpet1.mp3 -acodec pcm_s16le -ac 1 -ar 8000 trumpet1.wav
```

trumpet1.wavをSDカードに保存します。

### SSHログインしてコマンドで実行

```bash
$ /scripts/cmd aplay [WAVファイル] [ボリューム]
```

例. 

```bash
$ /scripts/cmd aplay /media/mmc/trumpet1.wav 10
```

### リモートからウェブ管理画面経由で実行

```bash
$ curl -X POST -H 'Content-Type: application/json' -d '{"exec":"aplay /media/mmc/test.wav 10"}' --output - 'http://[ATOM CamのIPアドレス]/cgi-bin/cmd.cgi?port=socket'
```

## 動体検知画像をLINE Notifyで送る方法

Webhookでイベントを通知する機能があるので、ATOM CamからNode-REDへ画像を送信し、LINE Notifyで画像を送ることができる。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f37323437392f31323631373363302d353034652d626562362d306538652d3661373131303166323334632e706e67_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/11b7ee0e-b244-811f-0a84-22cadf43b7cb.png)

Node-REDのフロー(ATOM Camから送信された画像を表示)

![スクリーンショット 2023-01-03 1.33.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/8d771ce1-8433-2939-77b5-84565aea1973.png)

```json:flows.json
[{"id":"daba8f567e987ac1","type":"http in","z":"17cb3ce7696216ca","name":"","url":"/atomcam","method":"post","upload":true,"swaggerDoc":"","x":200,"y":320,"wires":[["0681bd467aae2df4","e607bdd4be4b3037","6d6ddcb72bca1522"]]},{"id":"0681bd467aae2df4","type":"http response","z":"17cb3ce7696216ca","name":"","statusCode":"200","headers":{},"x":460,"y":320,"wires":[]},{"id":"e607bdd4be4b3037","type":"debug","z":"17cb3ce7696216ca","name":"debug 10","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":460,"y":360,"wires":[]},{"id":"21fb53b45bba9fa8","type":"image viewer","z":"17cb3ce7696216ca","name":"","width":160,"data":"payload","dataType":"msg","active":true,"x":710,"y":500,"wires":[[]]},{"id":"6d6ddcb72bca1522","type":"switch","z":"17cb3ce7696216ca","name":"","property":"payload.type","propertyType":"msg","rules":[{"t":"eq","v":"alarmEvent","vt":"str"},{"t":"eq","v":"recognitionNotify","vt":"str"},{"t":"eq","v":"image/jpeg","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":4,"x":370,"y":440,"wires":[["9083b5f7c1b5b442"],[],["1bc984d6d3b88fa0","864f0262b3bff090"],[]]},{"id":"1bc984d6d3b88fa0","type":"debug","z":"17cb3ce7696216ca","name":"debug 11","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":520,"y":460,"wires":[]},{"id":"864f0262b3bff090","type":"change","z":"17cb3ce7696216ca","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"req.files[0].buffer","tot":"msg","dc":true}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":500,"wires":[["21fb53b45bba9fa8"]]},{"id":"9083b5f7c1b5b442","type":"debug","z":"17cb3ce7696216ca","name":"debug 12","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":520,"y":400,"wires":[]}]
```

Node-REDフロー(LINE Notifyで通知)

![スクリーンショット 2023-01-03 2.56.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/1c55a7d0-b4d1-3b2b-fc9e-8158f5235b9a.png)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/63f39e6a-7bf2-2c1b-ea30-e8a351575706.png" width="50%">

(参考)

https://zenn.dev/dsl_gunma/articles/f29a712f9af872