Raspberry PiからLINEに自動メッセージを送る方法(活用事例あり)

Raspberry PiからLINEに自動メッセージを送る方法(活用事例あり)

プログラミング言語PythonでLINEにメッセージ通知を送ることができます。Raspberry Piで自動メッセージを使うと、外出先でもラズパイの情報を受け取ることができるため、活用の幅が一気に広がります。

LINE Notifyのトークンを取得する

メッセージの送信にはLINE Notifyという無料のサービスを利用します。サービスを利用するには、トークンの発行が必要です

トークンとは

LINE Notifyにアクセスするために必要な認証情報を表す文字列のことで、パスワードのようなものです。

「LINE Notify」のトークンは以下のページから取得できます。

LINE Notify

画面右上の「ログイン」を押します。

メールアドレスとパスワードを入力してログインします。

ユーザー名を押して、マイページを押します。

「トークンを発行する」ボタンを押します。

トークン名を入力します。

例えば、トークン名を「ラズベリーパイからの通知」と設定した場合、以下のようなメッセージになります。

「発行する」ボタンを押します。

トークンが発行されます。「コピー」ボタンからトークンをコピーします。このトークンを使う事で「LINE Notify」が利用できるようになります。

ページを閉じるとトークンは二度と表示されないので、確実にコピーしてトークンを保存しておきましょう。

LINEのトークに、「LINE Notify」からトークン発行を知らせるメッセージが来ます。

LINE通知を送るプログラム

import requests

url = "https://notify-api.line.me/api/notify" 
token = "トークンをここに入力"
headers = {"Authorization" : "Bearer "+ token} 
message =  "そぞら@プログラミングに夢中すぎる会社員より" 
payload = {"message" :  message} 
r = requests.post(url, headers = headers, params=payload)
そぞら
そぞら

4行目には発行したトークンを入力してください。

上記のプログラムを実行すると、以下のようにメッセージが送られます。

6行目のmessage = ” ” の中身は変更可能です。好きなメッセージに変えてみてください。

Raspberry Piで「ごみ出し通知システム」を作ろう

LINE通知機能を使った活用事例を紹介します。

ごみの日ってなかなか覚えられないですよね。資源ごみなどは回収頻度が少ないため、下記のようなパンフレットを確認する必要があり、かなり面倒です。

また月1回の危険不燃物の日に出しそびれると、保管場所が片付かず精神的ショックが大きいです。

Raspberry Piは日常の「ちょっとした悩み」を解決してくれます。既製品にはない「痒い所に手が届く」システムが作れます。僕の考えたシステムは以下の通りです。

  1. 本日の日付を取得する
  2. 本日が第何週の何曜日かを判定する
  3. 本日が何ごみの日かを判定する
  4. ごみの日であれば、品目をLINE通知する
  5. 上記のプログラムを毎朝6時に実行する
import datetime
import requests

#LINEメッセージ送信の関数
def send_message(gomi_type):
    url = "https://notify-api.line.me/api/notify" 
    token = "トークンをここに入力"
    headers = {"Authorization" : "Bearer "+ token}
    message =  (gomi_type)
    payload = {"message" :  message} 
    r = requests.post(url, headers = headers, params=payload)

#今日は第何週の何曜日かを調べる関数
def get_WeekNum_and_DayOfWeek(date_):
    # リストを用意(weekday()で取得した数値を曜日に変換)
    lists=["月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","日曜日"]
    divmod_=divmod(date_.day,7) # 日付を7で割って商と余りを取得
    
    # 商が0=日付が6日以下の場合は第一週
    if divmod_[0]==0:
        week_num=1
    # 余りが0=7の倍数の日数は商=第X週
    elif divmod_==0:
        week_num=divmod_[0]
    # それ以外=商が1以上かつあまりもある⇒商+1=第X週
    else:
        week_num=divmod_[0]+1
    # 戻り値は第X週と曜日の二つ
    return (week_num,lists[date_.weekday()])

date_=datetime.date.today()
week_num,DayOfWeek=get_WeekNum_and_DayOfWeek(date_)
print(f"{date_}は第{week_num}週{DayOfWeek}")

#ゴミの種類を入れるための変数を作る。初期値は空白
gomi_type = ""

#ごみの日かどうかを判定する
if DayOfWeek == "水曜日" or DayOfWeek == "土曜日":
    gomi_type = "今日は「燃えるごみ」の日です。"
    
if DayOfWeek == "金曜日":
    
    #第一週、第三週の場合
    if week_num == 1 or week_num == 3:
        gomi_type = "今日は「燃えないごみ、びん・かん」の日です。"
        
    #第二週の場合
    if week_num == 2:
        gomi_type = "今日は「資源古紙、ペットボトル、危険不燃物」の日です。"
        
    #第四週の場合    
    if week_num == 4:
        gomi_type = "今日は「資源古紙、ペットボトル」の日です。"
    
if gomi_type == "":
    print("今日はごみ収集の日ではありません。")

else:
    print(gomi_type)
    #LINEメッセージ送信
    send_message(gomi_type)

プログラムの保存

プログラムの解説

第何週の何曜日かを調べる部分は難易度高めです。しかし、ネット上には先人たちの知恵が豊富に存在します。ありがたく使わせてもらいましょう。

参考にさせていただいたサイト
【Python】日付から第何週何曜日を取得する

まず31行目で本日の日付を取得します。

32行目で関数「get_WeekNum_and_DayOfWeek」を使うと、第何週の何曜日かを求めることができます。

毎朝6時にプログラムを定期実行する

ラズベリーパイでプログラムを決まった時間に自動で実行するときは、Cronを使います。Cronでは以下の項目が設定できます。

  • 実行時間(特定の時刻、日、月、曜日)
  • 実行頻度(分単位、時間単位、日単位、月単位、曜日単位)
  • 実行するコマンドまたはスクリプト
crontab -e

エディター(ファイルを編集するためのソフト)を選択します。よくわからない人は1のnanoを選びましょう。1を入力してEnterキーを押します。

crontabというファイルが開きます。このファイルに定期実行の内容を記述します。

毎日6時に「gomi_LINE.py」を実行する場合は、以下のように書きます。

00 6 * * * python gomi_LINE.py

pyファイルが「/home/pi」に保存されている場合は、特にファイルパスを指定する必要がありません。

上記のコマンドをファイル中の一番下に追加します。

ctrl+Oで書き込み。ctrl+Xでエディターを閉じます。

完成!

あとは6時になるまで待つのみです。当然ですが、電源を切るとプログラムは実行されません。Raspberry Piは常時起動しておく必要があります。

Raspberry Pi 3 Model A+の時間当たり消費電力は1.75W。1kWhあたりの料金単価を35円で計算すると、1か月の電気代は約44円と非常に経済的です。

6時ぴったりにLINEを送ってくれました。

こうして、ゴミの出し忘れの心配から解放されたわけです。Raspberry Piは電子パーツを買わなくても、「ちょっと便利なモノ」が作れます。

コメント一覧

吉田純造

わかりやすく教えていただきありがとうございました

返信する
そぞら

ブログを読んでいただき、ありがとうございます。
皆様のお役に立てるよう改善を重ねてまいります。

返信する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です