ペットカメラを自作した話
概要
Raspberry Pi を使用して簡易的なペットカメラを自作したので、どうやって作ったかを記載します。
背景
我が家ではペット(デグー)を飼っており、外出中もペットの様子を確認したいと思い作成しました。
要件
- Raspberry Pi 4 と Rasberry Pi Camera はすでに持っている
- 外出先から自宅の Raspberry Pi で撮影した動画を見たい
- 可能な限りリアルタイムの映像を見たい
- 自宅に固定 IP は設定したくない
- 奥さんでも使えるようにしたい
- お金はかけたくない
- あまり工数をかけたくない
どう解決したか
最初はリアルタイム映像をいつでもスマホで見られる仕組みを考えていたのですが、それだと工数がかかり難易度も高かったので断念しました。
発想を転換して、スマホからコマンドを実行したらそこから10秒間動画を撮影し、その動画をスマホへ送るようなシステムにしました。通常のペットカメラとは機能が異なりますが、要件的には十分で、開発も1日で完成することができました。
技術選定
- Slack
- AWS Chatbot
- AWS Lambda (javascript)
- AWS SQS
- Go
構成図
詳細
Slack から SQS へエンキュー
外出先から自宅の Raspberry Pi を操作するには固定 IP を設定(もしくはそれ同等の作業)する必要があり、今回は Raspberry Pi から SQS を監視するようにしました。ただ Slack から直接 SQS にエンキューする機能は現状なさそうだったので、Slack → Chatbot → Lambda → SQS としました。
Chatbot
Slack と Chatbot を連携すると Slack から Lambda を起動することができます。詳しい連携方法は省きますが、連携後は下記を Slack で打つと Lambda を実行することができます。
@aws lambda invoke --function-name petCamFunction --region ap-northeast-1
ただこのコマンドをスマホでタイプするのは辛いし、そのうえ奥さんにこれをタイプしてもらうのは無理なので、Slackbot の機能を応用して「さつえい」と入力すれば自動でコマンドを送信するようにしました。
Lambda
Lambda で実行するコードは以下です。何も考えず SQS にエンキューするのみです。
const AWS = require('aws-sdk');
const SQS = new AWS.SQS({apiVersion: '2012-11-05'});
const QUEUE_URL = 'https://sqs.ap-northeast-1.amazonaws.com/XXXX/PetcamQueue';
exports.handler = (event, context, callback) => {
var params = {
MessageBody: '1',
QueueUrl: QUEUE_URL,
DelaySeconds: 0
};
var status = 0;
SQS.sendMessage(params, function(err, data) {
if (err) {
status = 500
console.log('error!', err, err.stack);
} else {
status = 200
console.log('success!', data);
}
});
};
ポーリング、撮影、Slack へ動画送信
Raspberry Pi 上では3つの処理を行なっています。すべて Go で書きました。
- SQS をポーリング
- キューを発見したら撮影
- 撮影が終わったら Slack へ動画を送信
SQS をポーリング
エンキューされたキューがないかを監視します。ロングポーリングでできるだけアクセス数を少なくしております。
撮影
Raspberry Pi で動画を撮影するコマンド(raspivid
)を実行しています。
※Rasbberry Pi の OS は Ubuntu 20.04 を使用しています。
Slack へ動画を送信
Slack App を登録して Web API で動画ファイルをアップロードしています。
実行画像
※デグーさんはお布団に隠れているので写ってないです。。
AWS の無料枠
AWS の利用料金は全て無料枠で済んでおります。
- AWS Chatbot を使用すること自体は無料
- Lambda は 100万リクエスト/月 まで無料
- SQS は 100万リクエスト/月 まで無料
※記事記載時の情報です。また利用方法や設定によっては無料枠を超過する可能性があるのでご注意ください。
最後に
今回紹介した方法はペットカメラ以外にも応用できると思うので何かの参考になれば嬉しいです!
Discussion