BETA

Python+LINE Notify+cronを使ってシェアハウスのゴミ当番を通知する機能を作った話

投稿日:2019-12-07
最終更新:2019-12-07

シェアハウスに住んでいて問題として上がるのがゴミ問題

ゴミ捨ては住人が順番に捨てるというルールでやっていたのですが、以下の問題がありました。
・ゴミ捨てのカレンダーはキッチンにあるのでキッチンを利用しない人はゴミ捨ての当番に気づかない
・ゴミ捨てに無関心な住人がいる
・ゴミ捨てをしないと次にゴミを捨てる人の負担になってゴミ捨て場が荒れていくのと同時に住人のストレスも溜まっていく
管理人から「ゴミ捨てをしなかった人にはペナルティを考える」というところにまで発展しました

じゃあ、どうしよう?

シェアハウスでの連絡手段はLINEでやりとりをしているので、ゴミ捨て問題を解決するにはLINEを使うのが一番だと思いました。
そこで見つけたのがLINE Nortifyでした。

下記のリンクが参考になります
[超簡単]LINE notify を使ってみる
https://qiita.com/iitenkida7/items/576a8226ba6584864d95

これを使ってゴミの日になると自動でゴミの種類とその日の当番の人を通知する機能を実装しました。

Python + cronで実装

ゴミの日の7:30に通知するようにプログラムを実行して欲しかったので、cronを使いました。
設定については後ほど。
言語はなんでも良かったのですが、せっかくなので今流行のpythonで実装してみました。
以下が実際のコードです。
ただただ関数を羅列しただけ、命名の仕方がクソみたいなコードですが、クラス化するほどの規模でもないのでいいかなと。レビュー頂けると嬉しいです、小躍りします。

import requests  
import datetime  
import calendar  

today = datetime.date.today()  
def send():  
    weekday = today.weekday()  
    youbi = [  
            {'key': '月', 'value': '可燃ゴミ'},  
            {'key': '火'},  
            {'key': '水', 'value': '資源ゴミ'},  
            {'key': '木', 'value': '可燃ゴミ'},  
            {'key': '金'},  
            {'key': '土', 'value': 'ペットボトル'},  
            {'key':'日'}  
    ]  

    dutyMember = ['シェアハウスの住人たちのリスト']  
    token = '発行したトークン'  
    url = 'https://notify-api.line.me/api/notify'  
    gomiList = getGomiDay()  

    #年末年始はゴミを回収しない(開始)  
    newYearsHolidayList = []  
    startDay = datetime.date(today.year,12,29)  
    deltaDay = datetime.timedelta(days=1)  
    for i in range(6):  
        newYearsHolidayList.append(startDay)  
        startDay += deltaDay  
    if today in newYearsHolidayList:  
        return false  
    #年末年始はゴミを回収しない(終わり)  
    if today.day in gomiList:  
        index = gomiList.index(today.day)  
        message = '\n今日は{}月{}日({}) {}の日です。\n当番は{}さんです。'.format(today.month, today.day, youbi[weekday]['key'], youbi[weekday]['value'], dutyMember[index])  
        payload = {'message': message}  
        headers = {'Authorization': 'Bearer ' + token}  
        r = requests.post(url, data=payload, headers=headers)  

def getGomiDay():  
    month = today.month  
    monList = [x[calendar.MONDAY] for x in calendar.monthcalendar(2019, month)]  
    wedList = [x[calendar.WEDNESDAY] for x in calendar.monthcalendar(2019, month)]  
    thursList = [x[calendar.THURSDAY] for x in calendar.monthcalendar(2019, month)]  
    satList = [x[calendar.SATURDAY] for x in calendar.monthcalendar(2019, month)]  
    petSatList = satList[1::2] if 0 in satList else satList[0::2] #リストに0があればゴミの日は1番目から、なければ0番目から。  
    petSatList = petSatList[:2]  
    gomiList = monList + wedList + thursList + petSatList  
    gomiList = [x for x in gomiList if x > 0]  
    gomiList.sort()  
    return gomiList  

if __name__ == '__main__':  
    send()  

続いて、crontabでの設定
エラーと標準出力の設定をしているのに、エラーしか吐いてくれないのはなぜ?

30 7 * * * /path/to/python3 /hoge/fuga/実行ファイル.py >> /var/log/cron.log 2>&1  

とまあ、こんな感じで毎日7時半になったらcrontabで設定したパスのファイルを実行してくれて、ゴミの日だったら通知するといういたってシンプルなものを作ってみました。

実際の画面

同居人からの反応

「わかりやすい!」
「忘れずにゴミを出せました、ありがとうございます!」
「神」など、嬉しい反応をいただきました。作って良かったです。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

自分の思考、学んだことをアウトプットする場

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう