4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

身の回りの困りごとを楽しく解決! by Works Human IntelligenceAdvent Calendar 2024

Day 16

ラズパイとAmazonS3を使った子豚の出産通知の改善

Last updated at Posted at 2024-12-15

はじめに

以前、畜産農家が深夜に子豚が産まれていないかを見に行く手間の削減として、ラズパイを使って子豚の出産通知を作ったのですが、GoogleDriveとの認証でエラーが出るようになってしまい、調べたのですが解決できず。
また、通知された画像を見る際、GoogoleDriveにアクセスする必要があり、ワンクリック必要なのがちょっと煩わしかったので、その課題解決としてAmazonS3を活用することにしました。

その結果、LINE通知でGoogleDriveのURLを送っていた部分が、画像で送付されるようになったので、LINEの画面だけで完結するようになり、以前のものより使いやすいものになりました。

※変更の内容
image.png

システムの概要と改善箇所

このシステムの処理の流れは以下のようになっています。
ラズパイで撮影した画像をユーザに見せる方法として、GoogleDriveを使用していたのですが、エラーになってしまったので、通知の方法をAWSを活用するように置き換えました。

  1. 画像を撮影
  2. 画像を保存
  3. 画像分析
  4. 写真に情報を追記
  5. 画像をGoogleDriveにアップロード → 画像をAmazonS3にアップロード
  6. GoogleDriveのURLをLINE通知 → URLを参照して画像そのものをLINE通知

image.png

AmazonS3にアップロードする処理

引数で撮影した画像のファイルパスを渡して、S3にファイルをアップロードします。
その後、URLを取得して戻り値で返します。

'XXXXXXXXXX'にはAWSでバケットを作るときに取得したアクセスキーを、
'YYYYYYYYYY'にはAWSでバケットを作るときに取得したシークレットキーを設定します。

import boto3
from botocore.exceptions import NoCredentialsError

def s3_upload(filepath):
    # AWSの設定
    AWS_ACCESS_KEY = 'XXXXXXXXXX'
    AWS_SECRET_KEY = 'YYYYYYYYYY'
    REGION_NAME = 'ap-northeast-1'
    BUCKET_NAME = 'piglet-bucket'

    # boto3のS3クライアントを作成
    s3 = boto3.client(
        's3',
        aws_access_key_id=AWS_ACCESS_KEY,
        aws_secret_access_key=AWS_SECRET_KEY,
        region_name=REGION_NAME
    )

    #日時からファイル名を作成
    now = datetime.datetime.now()
    nowtime = now.strftime('%Y%m%d%H%M')
    object_name = nowtime + ".jpg"

    s3.upload_file(filepath, BUCKET_NAME, object_name)
    url = s3.generate_presigned_url('get_object',
                                    Params={'Bucket': BUCKET_NAME,
                                               'Key': object_name},
                                    ExpiresIn=3600)
    return url

URLを取得して画像をLINE通知する処理

取得したURLを使って、linebotAPIで通知します。

"XXXXXXXXXXXXXX"にはLINEBotのアクセストークンを設定します。

def line_notice_image(url):
    # アクセストークンの設定
    LINE_CHANNEL_ACCESS_TOKEN = "XXXXXXXXXXXXXX"
    line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)

    # 画像の送信
    messages = ImageSendMessage(
        original_content_url=url,  # 画像のオリジナルURL
        preview_image_url=url  # プレビュー画像のURL(同じURLを使うことができます)
    )
    line_bot_api.broadcast(messages)

おわりに

子豚の出産通知自体が技術を使った解決で、この改善はちいさなものですが、システムを作った後も困りごとは尽きません。課題にぶつかって心が折れそうなとき、少し引いてみると新しいものや便利なものが見つかったりするので、この記事がその一助のなればいいなと思います。

ちなみに、当初AWSを使わなかったのはコストの面も大きかったのですが、実際にこの程度の使用ならつけっぱなしでも大した額にはならなそう(1ドル以下)です。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?