・前回
・今回やること
①ゴミ出しの日の前日にライン通知をする。
(住んでるところのゴミ出しルールが前日に出して、早朝に回収のため)
・解決したい課題
ゴミ出しの日を忘れがち
夏場は特に、出し忘れは不衛生に直結するのでよくない。
もう夏終わるじゃんという突っ込みは受け付けないものとする。
・技術的なポイント
①第〇水曜などがあるため、単純な曜日判定以外の処理が必要。
②Line連携が必要
③初めてPythonを書くためPythonに慣れる必要がある。
・主文
ライン連携については以下の記事を、
曜日判定については以下の記事をそれぞれ参考にさせていただいた。
あとはこの二つのプログラムを組み合わせて、
自分の住む場所に合わせてIF文でメッセージだけ変更するだけなのだが、
Pythonの摩訶不思議な仕様(変数宣言なし、インデントでIFやWhileの範囲を決める、インデントの外で変数が使えない、代入は=なのに比較演算子は==、andやorは小文字じゃないと認識してくれない等)に翻弄されながら簡単なIF文に1,2時間ぐらいかけてしまった。
最終的にできたものが以下。
なお、ゴミ出しの曜日は居住地バレの典型例であり、IF文の条件を隠しているのはご容赦いただきたい。
gomidasi.py
def LinePrint(msg):
import datetime
today = datetime.datetime.now()
day = today.day
wd = today.weekday()
#1週間前の日付が同月かどうか調べる -> 1日より前か後かで判別
#dayが1日以降(同月)なら出現回数+1してdayに1週間前の日付を代入(-7する)、1日より前(前の月の日付)なら処理終了
weeks = 0
while day > 0:
weeks += 1
day -= 7
if (wd == (燃えるごみの曜日)) or (wd == 燃えるごみの曜日):
message = "明日は燃えるごみの日です。"
elif (weeks ==(第〇週)) and (wd == (不燃ごみの曜日)):
message = "明日は不燃ごみの日です。乾電池も捨てられます。"
elif (wd == (第〇週)) and ((weeks == (第×週)) or (weeks == (紙資源ごみの曜日))):
message = "明日は紙資源ごみの日です。段ボールや雑誌を捨てる際は縛って出してください"
elif (wd == (第□週)) and ((weeks == (第△週)) or (weeks == (プラスチック資源ごみの曜日))):
message = "明日はプラスチック資源ごみの日です。ペットボトルやプラスチックなどが出せます"
else:
message = "今日はゴミの日ではありません"
print(message)
import requests
token='(LINE Notifyのトークン)'
headers = {'Authorization': 'Bearer %s'%token, }
files = {'message': (None, message),}
r = requests.post('https://notify-api.line.me/api/notify', headers=headers, files=files)
print(r,r.text)
LinePrint('')
あとはこれをRaspberry Pi側でCronで定時実行してやればよい。
chmod 777 /home/(ユーザ名)/gomidasi.py
00 18 * * * sudo /usr/bin/python3 /home/(ユーザ名)/gomidasi.py
※毎日18時に通知
・感想
前回よりすごく簡単だった。ほとんどPython上で完結したし。
使いやすい連携機能を用意してくれているLineにも感謝したい。
・次やりたいこと
たぶんCO2検知をやる。