GRAPH

ノードをドラッグ · ホイールでズーム · 背景をドラッグして移動

グラフを読み込んでいます

← 記事一覧へ

ニワトリ小屋からSORACOMデバイスを利用し、LINE通知させる仕組み

Wi-Fiなどの回線がない ニワトリ小屋から、温湿度を SORACOMデバイス ~ SORACOM Funk ~ Lambda ~ LINE というフローでデータを届けるための構成を記載する。

はじめに

このたび個人的に ニワトリ小屋を作ることになりました。

ただし、自宅からは少し離れた位置に土地をお借りしているため気軽に足を運ぶことが出来ません。

基本的にニワトリは暑さに弱いとされているため、実際作成したニワトリ小屋における温湿度が、どの程度になるのかデータ取得を考えました。

「温度」と「湿度」から「暑熱ストレス」の指標(THI)を計算し、一定の値を超過したら 家族の LINE に通知させるようにもしました。

ニワトリ小屋の 3D モデル。切妻屋根のパイプハウス型で、壁は緑のネット、正面に白い扉がある。
小屋のイメージ 3D モデル(Blender で作成)

構成図

以下がシステム全体の構成図となります。

ニワトリ小屋遠隔監視システムの構成図。SORACOM Funk が IAM ロール経由で受信用の Lambda を直接呼び、その Lambda が計測値を DynamoDB へ保存したうえで、デバイス異常を除いて受信のつど通知用の Lambda を非同期で呼ぶ。段階の判定は呼ばれた通知用の Lambda が行い、必要なときだけ LINE へ送る。定期見回りの Lambda は Parameter Store からトークンを取り、自分で LINE へ送る。ダッシュボードは S3 と CloudFront で配信し、参照 API だけ API Gateway を通す。

図を押すと別タブが開きます。
図の破線の矢印は、Lambda の非同期呼び出し(InvocationType=Event)を表します

データの流れ

図の中の番号は、次の順に対応します。

# イベント 詳細
1 センサー から SORACOM に送信 GPS マルチユニット SORACOM Edition が温度・湿度・電池残量を計測し、SORACOM 回線でクラウドへ送信
2 SORACOM から Lambda呼出 SORACOM Funkという機能 で IAM Roleを引受け、TelemetryReceiver(Lambda) を起動
3 テレメトリ保存と通知トリガ TelemetryReceiver(Lambda) が TelemetryTable(DynamoDB) へ書込む。書込み後、デバイス異常のデータを除き NotificationEngine(Lambda) を 閾値判定のため呼出し
4 LINE への通知 通知が必要となる場合、NotificationEngine(Lambda) が SSM Parameter Store から LINE トークンを取得し、LINE Messaging API の broadcast で 通知
5 30分毎の 監視 30分毎に EventBridge で PeriodicMonitor(Lambda) を起動。データの途絶や復帰の判定、毎朝の定時通知など LINE 通知。併せて、このタイミングでニワトリ小屋付近の天気情報も取得し、外気温(実況値とアメダスの実測)を TelemetryTable(DynamoDB) へ保存
6 ブラウザから 画面の表示 CloudFront でリクエストを受け、S3にある静的画面を返却、確認内容については API Gateway へ振分け
7 画面から データの参照 API Gateway で Cognito の JWT を検証、ReferenceApi(Lambda) で DynamoDB に保存されている計測値と保存済みの天気を返却

機能詳細

1. 物理デバイス

GPS マルチユニット SORACOM Edition

小屋には商用電源がなく、Wi-Fi も届かないため、「充電池で動き、自分で回線を持つ」といった機器を探し、今回は「GPS マルチユニット SORACOM Edition」 を利用することにしました。

こちらの物理デバイスは、温度・湿度・加速度・GPS のセンサーと、LTE Cat.M1(LTE-M)の通信モジュール、1,500 mAh のバッテリーを内蔵しています。 充電は microUSB で、本体は約 83 × 49 × 13.8 mm、約 63 g です。

はんだ付けや筐体設計なども必要とせず、SIM が最初から入っているので、届いた日に送信まで動きます。 送信間隔などは SORACOM のコンソールから変えることが可能で、送られてくるデータに関しても コンソール画面から確認することも出来ます。

GPS マルチユニット SORACOM Edition の本体。白い樹脂のケースに水色の SORACOM ロゴのシールが貼られ、側面に充電端子とボタンがある。下には SORACOM の IoT DIY レシピの紙が敷いてある。

(出典: SORACOM ストア GPS マルチユニット SORACOM Edition、2026-09-11 確認)。

デバイスで送れるデータ情報

このデバイスが送るデータは JSON で、フィールドは以下のとおりです。 今回は小屋に設置するという背景より「温度」「湿度」「電池残量」「電波強度」といったものを利用する用にしました。

フィールド 意味 値の範囲
temp 温度(℃) -20 〜 60
humi 湿度(%) 0 〜 100
bat 電池残量 -1: 充電中、1 〜 3: 残量の段階
rs 電波強度 -1: 圏外、0 〜 4
lat / lon 緯度・経度(度) null は測位失敗
x / y / z 加速度(mG) -8128 〜 8128
type 送信種別 0: 定期送信または加速度割り込み送信、1: 手動送信、-1: デバイスで一時的な問題

(出典: GPS マルチユニット SORACOM Edition のデータフォーマット、2026-09-11 確認)

2. データ転送

転送における考え方の方針

利用者は家族 2 人で、基本的に 1 時間に 1 件のデータが来るだけの仕組みです。そのため、データを受けて保存し しきい値を判定、LINE に送るなどの処理は、すべて AWS のサーバーレスサービスに任せ、管理するサーバーをゼロにしました。

もう 1 つは、長期のアクセスキーを作らず、デバイス側から AWS を呼ぶ経路は一時的な認証情報で呼び出すような構築を考えました。

SORACOM Funk から Lambda を直接呼出し

SORACOM には、デバイスのデータをクラウドへ渡すサービスが複数あります。SORACOM Beam を使って HTTP に変換し、API Gateway を経由して Lambda へ渡す構成も取れますが、今回は宛先が Lambda だけなので、間に置くものが要りません。 そのため SORACOM Funk を選択しました。Funk を利用することで、デバイスのデータを引数にして Lambda 関数を直接呼び出すことが可能となります。

クロスアカウントの設定

SORACOM Funk から Lambdaを呼び出すためには、Lambda を呼びだせる権限の入ったロールを、私の AWS アカウントに作成します。

このロールには 2 つの設定をしていきます。

1 つ目は「誰が使えるか」という部分で、SORACOM 社の AWS アカウントを信頼し、且つ 外部 ID(ExternalId)が一致することを条件にして、このロールを利用できるのは SORACOM 社の AWS アカウント だけという条件を付与します。

ここでの 外部 ID(ExternalId) とは、私が決めた任意の文字列で、同じ値を SORACOM 側の Funk 設定にも登録することで、両方が一致したときだけロールを引き受ける確認のために利用します。

2 つ目は「何ができるか」という部分で、Lambda に対してlambda:InvokeFunction だけを許可するように設定をしています。

準備0 / 3

A に、B だけが使えて受信 Lambda だけを呼べるロールを用意します。B が期限つきクレデンシャルを使い、A の受信 Lambda を呼び出します。

(出典: SORACOM Funk で AWS Lambda を利用する、2026-09-14 確認)

3. 保存

受信したデータから THI(温湿度指数)を計算して DynamoDB に保存

Lambda は、受信した温度と湿度のデータから THI を計算してから DynamoDB に保存します。

THI(Temperature-Humidity Index、温湿度指数)とは、温度と湿度を組み合わせた家畜の熱ストレスの指標です。温度だけを見るよりも、湿度の影響を含めて暑さを評価できます。

(出典: 暑熱ストレスが産業動物の生産性に与える影響、農研機構 九州沖縄農業研究センター 阪谷美樹、2014 年、2026-09-13 確認)。

4. 判定・通知

LINE Messaging API の broadcast で家族に送信

通知先は LINE を利用します。単純に家族が毎日開いているアプリなので、専用アプリやメールより確実に見られるからです。

送信は Messaging API の broadcast です。公式アカウントを友だち追加した全員(今回は家族)に同じ内容を通知させることが可能です(出典: LINE Messaging API メッセージを送信する、2026-09-11 確認)。

判定基準

通知基準に関しては、「温度」と「湿度」の組み合わせから THI の閾値を設定して、超過した場合 通知をするロジックにしました。

以下「温度」と「湿度」を動かすと、どの指標で判定され、通知が送られるかを確認できます。

温度 22.0 ℃・湿度 60 % を受信した代表状態です。

THI68.6
判定に使う指標THI
段階正常
LINE 通知通知しない

THI 68.6 はしきい値未満

5. ダッシュボード

LINE の通知は異常を知らせるものなので、「いま小屋の温度は何度か」「この 1 週間の経過はどうだったか」については別に画面を用意しました。

React と TypeScript で作り、S3 に置いて CloudFront から配信しています。Cognito を利用すること家族のログインを管理し、ログイン時にAPI Gateway 経由してデータを読み込みしています。

フロントエンドには、小屋内気温と THI の推移をグラフ。ニワトリ小屋付近の、その日の天気予報、そして機器の状態を表示させています。

ダッシュボードの画面。上部に「いまの判定 注意」と THI 76.5、小屋内温度 24.8℃、小屋内湿度 98.5%、外気温 24.2℃。下部は「THI の推移」で、24 時間・7 日・30 日の切り替えと、危険・警戒・注意・快適の帯を重ねた折れ線グラフ。
いまの判定と THI の推移
ダッシュボードの天気。現在の外気温(予報)24℃ 霧雨、今日の最高 26.5℃・最低 23.4℃、最寄りのアメダス観測所の実測、10 時から 12 時の毎時予報、明日の予報。観測所名は伏せてある。
天気予報と最寄りのアメダス実測
ダッシュボードの「小屋の状態」。電池は段階 3 で十分、受信状態は安定で最終受信 10 分前、送信間隔は 60 分の定期送信。
小屋の状態(電池・受信・送信間隔)

まとめ

今回離れた土地にあるニワトリ小屋の温湿度を、 LINE に通知する仕組みを作りました。

オフグリッド(電力会社の送電に繋がっていない状態)の環境のため、ある程度縛りがある中で「まずは何かしらの値を取得したい」という思いで、今回の構成を考えました。

いまのところ 2026-07-26 に受信を始めてから 46 日間、1 時間に 1 回の受信が毎日 23〜24 回届き、Lambda のエラーは 0 件といった運用状況になっています(2026-09-10 確認)。

通知の次について

正直、今回の通知だけでは「暑くなった」しか分かりません。ただし、数字が無ければ「涼しくなった気がする」だけで終わってしまう状態からは、脱却したと思っています。

取得した値と、ニワトリの健康状態などを突き合わせることによって、意味のあるデータを取得していければいいかと考えています。

← 記事一覧へ