ENGINEER BLOG

ENGINEER BLOG

Raspberry Pi + LINE Notifyでペットケージの温度管理

こんにちは。初のエンジニアブログ執筆となります、
入社3年目・SCI本部近藤です。

先日、社内技術カンファレンスにスピーカーとして参加し、参加賞としてRaspberry Pi4 B(4GB)を頂きました。

ラズパイ箱画像

折角頂いたものなので、何か活用できないかなあと考えていたところ、「ペットケージの温度管理」をしてみようと思い至りました。

今回は、Raspberry PiとLINE Notifyで
「定期的にケージの温度を計測し、その結果をLINE Notifyで通知する」という簡単なシステムを作りました。

かわいいインコの写真とともに、楽しんでいただけたら幸いです。

開発背景

こまめさん1ラムネさん1

うちでは2羽のセキセイインコを飼っているのですが、
左のこまめさんは、まだ1歳にもなっていない「おチビちゃん」、
右の黄色頭のラムネさんはお年寄りの老鳥さんです。

子どもとお年寄りは体調を崩しやすいといいますが、これは鳥も同じ。
体調管理のためにも
「こまめにケージの温度を確認」→「ヒーターのON/OFFで温度調整」
を毎日する必要があります。

しかし、今使っている温度計はアナログ温度計。
これの何がまずいかというと

  1. 「こまめに温度を確認しに行く」作業が大変
  2. 温度計はケージの横に吊り下げているので、
    インコを寝かしている間の温度は見れない
    (インコは物音に敏感なので、ちょっと音を立てると起きてしまうのです)
  3. 忙しいと、定期的に温度を見に行けない

という、地味に面倒な問題があるのです。
普段鳥を溺愛している家族も、さすがに都度都度温度を見に行くのは面倒だと感じていた模様。

そこで今回は、愛しき小鳥たちの生活環境向上のため、
以下のような要件を満たす、ちょっとしたシステムを作ろうとしました。

  1. 直接見に行かなくても温度を確認できる
  2. インコが寝ている間も温度を記録し、確認できる
  3. 定期的に温度を通知してくれる

ではこれから、必要な機材と開発環境を説明します。

必要機材・環境

  • Raspberry Pi 4 B(4GB)
  • Raspberry Pi OS 10(buster)
  • Python3.7.3
  • ブレッドボード
  • ジャンパーワイヤー(オス-メス)×6本
  • 抵抗器(4.7KΩ推奨)
  • DHT11(温湿度センサーモジュール)

ラズパイは予めセットアップし、Wi-Fiに繋いでおきます。

配線

まずは、ラズパイの電源がONになっていないことを確認して、配線していきます。

配線は以下の通りになっています。

ブレッドボード

実際の画像がこちら。

実際の模様

(短いワイヤーが無かったので、ちょっと不格好です。)

ブレッドボードに刺さっている、
四角い青色のパーツがDHT11という温湿度センサモジュールです。
このモジュールを使うことで、温度と湿度を観測することができます。

温度管理プログラムの作成

ここからはやっとプログラムの作成に移ります。
ラズパイの言語はPythonを使います。

フォルダ構成

今回のフォルダの構成は以下の通りです。

home
 └ pi
    └ rasptemp
        ├ dht11・・・(1)
        ├ Rasptemp.py ・・・(2)
        ├ SendMessage.py・・・(3-1)
        ├ lineMessage.py・・・(3-2)
        └ temp_hmdt.csv・・(4)

上から

  1. 温湿度センサモジュールライブラリ(DHT11ライブラリ)
  2. 温度記録プログラム
  3. メッセージ通知プログラム
    1. 温度記録情報を取得し通知するプログラム
    2. LINENotifyとの連携プログラム
  4. 温湿度記録CSV

となっています。
これから順に追って確認していきましょう。

DHT11ライブラリのインストール

まずはライブラリをインストールします。
GitHubから、DHT11 python libraryのリポジトリを確認し、これをクローンしましょう。

git clone https://github.com/szazo/DHT11_Python.git
で、持ってくることができます。

その後、ファイルエクスプローラーからdht11というフォルダがあることを確認します。
確認出来たら、新たにプログラムを管理するフォルダに、dht11のフォルダごとコピーしたものを配置します。

今回は、/home/pi/rasptempのフォルダを作り、rasptempdht11を配置しました。

これで import dht11と書くだけで簡単に温湿度をとるメソッドが使えるようになります。

温度・湿度をCSVに記録する

まずは、取った温度をCSVに記録するプログラムを作っていこうと思います。

折角湿度もとれるモジュールなので、不快感の測定も兼ねて、湿度も記録することにしました。

RaspTemp.pyの作成

import RPi.GPIO as GPIO
import dht11
import datetime
import os

fileName ='/home/pi/rasptemp/temp_hmdt.csv' # ここに保存先のCSVファイルのパスを設定

tempGpio = 4 # GPIOのピン番号

GPIO.setmode(GPIO.BCM)
dhtStat=dht11.DHT11(pin= tempGpio)

# CSVファイルが無かった時の挙動
if not os.path.exists(fileName):
    thData =open(fileName,'w')
    thData.write('date_time,temp,hdmt\n')
    thData.close()

while True:
    
    stat = dhtStat.read() # 温度読み取り
    now =str(datetime.datetime.now())[0:16]
    data = [now,stat.temperature,stat.humidity] # 日時、温度、湿度の順番で1行のデータ
    if stat.temperature == stat.humidity == 0:
        continue
    thData = open(fileName,'a')
    thData.write(','.join(map(str,data)) + '\n')
    thData.close()
    
    break

GPIO.cleanup() # 初期化

生成されたCSV

生成されたCSVは以下のようになります。

date time temp hdmt
2021-05-05 11:23 25.9 51.0

以降、プログラムが実行されるたびに、最終行に記録が追記されていく形になります。

これで、「プログラム実行の度に、現在の温湿度を記録する処理」まで作ることができました。

最新記録を読んでLINEに通知する

先ほどのプログラムで作成した温湿度記録CSVから、最新のデータをLINE Notifyで通知します。

LINE Notifyとの連携

以前の記事でもLINE Notifyを利用していましたが、概ね流れは一緒になります。

LINE Notifyを使うことで、特定の通知を任意のトークルームで受信することができます。

大まかな流れは以下の通りです。

  1. LINE Notifyに自分のLINE IDでログイン
  2. マイページを選択
  3. アクセストークン発行
  4. トークンをコピーして控える
  5. 通知したいメッセージを作成
  6. トークンとメッセージをAPIにPOSTする

今回は専用の通知ルーム「ラズパイ温度管理ルーム」を作り、
温度を見たい人を招待する方式にしました。

以下が定期通知のコードです。

SendTemp.pyとlineMessage.pyの作成

import pandas as pd
import os
import lineMessage

filePath ='/home/pi/rasptemp'

data = pd.read_csv(filePath + '/temp_hmdt.csv', index_col ='date_time') # CSVを取り込む
data.index = pd.to_datetime(data.index)
# CSV最終行を取り出して通知メッセージ作成
temp = data.tail(1).iloc[0,0]
humidity = data.tail(1).iloc[0,1]
result = '現在の温度&湿度\n'+'温度' + str(temp) + '℃ 湿度' + str(humidity) +'%'

# 通知メッセージ送信
lineMessage.sendLineMessage(result)

#!/usr/bin/env python
import requests

# LINE通知メソッド
def sendLineMessage(message):
    url = "https://notify-api.line.me/api/notify" 
    token = "【トークン番号】"
    headers = {"Authorization" : "Bearer "+ token} 
    payload = {"message" :  message} 
    r = requests.post(url, headers = headers, params=payload)

sendLineMessagetokenに、発行したアクセストークンを書き込みます。
(今回は間に合わせ用コードだったので、トークンベタ打ちにしていますが、外出しのほうが望ましいです)

これで、「最新の温湿度記録をメッセージにし、LINEで通知する」まで処理を作ることができました。

定期的に実行させる

crontabを使って、先ほどのプログラムを定期的に実行します。
今回は以下の設定で定期実行することにしました。

  • 温度記録は1分ごと
  • 温度通知は1時間ごと(9-23時の間)
    • 夜間~早朝に通知が行くと通知欄がやかましくなってしまうため、実行時間に制限を付けています

ターミナルから crontab -e を実行し、以下の通りに定期実行の処理を書いていきます。

crontabEditor

Cronの書式は
分 時 日 月 曜日 ”実行したいコマンドまたはスクリプト”

なので、

# 温度記録
* * * * * /home/pi/rasptemp/rasptemp.py
# 温度通知
00 9-23 * * * /home/pi/rasptemp/SendTemp.py

として、実行間隔をそれぞれ指定してあげます。

これで、毎分・毎時の処理が動くはず。

結果

LINEトークルームスクショ

結果はこの通り、1時間おきに温湿度が通知されるようになりました。

これでケージ温度を定期的に見ることができますし、
何らかの理由で通知がうまくいかなくても、CSVに温度湿度データを取りためてあるので、後から見返すことができます。
CSVなのでグラフ加工もしやすいです。

こまめさん2ラムネさん2

うちの子も、飼い主の温度調整レスポンスが早くなって嬉しそうです。

(そう見えているだけかもしれない……)

課題・今後の展望

現状の課題として、インコケージ周辺の温度が比較的高めになるため、ラズパイが熱を持ちやすく、時々通知の不具合を起こすことがありました。

対策として、ファンの導入や日の当たらない場所への設置などを検討する必要がありそうです。

また、今回は温度通知にとどまりましたが、最終的にヒーターのON/OFFを自動調整ところまで行けたら良いなと思っています。
(といっても、温度だけを見て暖房を上げ下げするのではなく、インコの様子を見るのも大事なので、どこまで作りこむかは検討が必要ですね。生き物の管理は難しいです。)

皆さんも、ラズパイでペットの環境を整えてみてはいかがでしょうか。