Raspberry Piで作った玄関の呼び出しブザーにLine通知も付けてみた

公開日:2018-12-18
最終更新:2018-12-18
※この記事は外部サイト(https://www.rocher.kyoto.jp/arbr/?p=1455)からのクロス投稿です

概要

このまえqiitaに書いたメール通知ができる玄関の呼び出しブザーにLine通知も付けてみたのでそのメモ。

環境

python3.7.0
raspbian9.4
Raspberry Pi B+

プログラム

事前準備

requestsモジュールを使うのでインストール

pip install requests

ソース

ほぼこちらのとおり。他に指定できるものはドキュメント参照。

LINE_TOKENは環境変数から取得。引数のcurrent_timeは呼び出し元でフォーマット済みの文字列

(line_notify.py)

#!/usr/bin/env python3  
# coding: utf-8  
import os  

import requests  

def line_notify(current_time):  
    url = 'https://notify-api.line.me/api/notify'  
    token = os.environ['LINE_TOKEN']  
    headers = {"Authorization" : "Bearer "+ token}  

    message =  '呼出ブザーが押されました %s' % current_time  
    payload = {"message" :  message}  

    r = requests.post(url ,headers = headers ,params=payload)  

if __name__ == '__main__':  
    line_notify( '2018/11/12 固定' )  

他のソース/設定ファイル

コントローラー

(control.py)

前の記事ではwait_for_edgeでボタンプッシュを検知していたが、SIGINTきても処理がとまらないとのことでadd_event_detectに変更

また、systemdに登録したのでsignalをハンドラで処理するように変更

#!/usr/bin/env python3  
# coding: utf-8  
from datetime import datetime  
from datetime import timedelta  
import logging  
import signal  
import sys  
import time  

import RPi.GPIO as GPIO  

from mail import visitmail  
from line_notify import line_notify  

def handler(signal, frame):  
    logger.info('break')  
    GPIO.cleanup()  
    sys.exit(0)  

def callBuzzer(channel):  
    try:  
        # ノイズ対策 静電気等のノイズでないか0.1秒以上続いていることをチェック  
        time.sleep(0.1)  
        if GPIO.input(pin) == GPIO.LOW:  

            # 連続クリック対応 何度もメールが飛ぶと面倒なので一定時間内のボタンプッシュは無視  
            # ノイズ対策の前に置くとこの処理時間で継続時間が長くなってしまうのでこの処理順にしている  
            global before_calltime  
            current_time = datetime.now()  
            if current_time < (before_calltime + timedelta(seconds=60)):  
                logger.debug('callback yet')  
                return  

            logger.debug('before_calltime:%s current_time:%s'  
                % (before_calltime.strftime("%Y/%m/%d %H:%M:%S"),current_time.strftime("%Y/%m/%d %H:%M:%S")))  
            before_calltime = current_time  

            logger.info('visit actions call')  
            str_current_time = current_time.strftime("%Y/%m/%d %H:%M:%S")  
            visitmail(str_current_time)  
            line_notify(str_current_time)  
    except Exception as e:  
        logger.error('error:  %s' % e)  

signal.signal(signal.SIGINT, handler)  
signal.signal(signal.SIGTERM, handler)  

try:  
    formatter = '%(levelname)s : %(asctime)s : %(message)s'  
    logging.basicConfig(level = logging.INFO, filename = 'doorphone.log', format=formatter)  
except:  
    print >> sys.stderr, 'error: could not open log file'  
    sys.exit(1)  
logger = logging.getLogger(__name__)  
#logger.setLevel(logging.DEBUG)  
loop_logger = logging.getLogger('loop_logger')  
#loop_logger.setLevel(logging.DEBUG)  

logger.info('start doorphone moniter')  
before_calltime = datetime.now() - timedelta(seconds=60)  

GPIO.setmode(GPIO.BCM)  
pin = 25  

GPIO.setup(pin, GPIO.IN,pull_up_down=GPIO.PUD_UP)  
GPIO.add_event_detect(pin, GPIO.FALLING, callback=callBuzzer, bouncetime=300)  

while True:  
    loop_logger.debug('main loop runnning')  
    time.sleep(1)  

メール送信処理

(mail.py)

引数かえたぐらいで特に変更なし

#!/usr/bin/env python3  
# coding: utf-8  
import configparser  
from email.mime.text import MIMEText  
from smtplib import SMTP  
import os  

def visitmail(current_time):  
    inifile = configparser.ConfigParser()  
    inifile.read('./config.ini', 'UTF-8')  

    ini_host = inifile.get('server', 'host')  
    ini_port = inifile.get('server', 'port')  
    ini_from = inifile.get('mail', 'from')  
    ini_to = inifile.get('mail', 'to')  
    ini_title = inifile.get('mail', 'title')  

    with SMTP(host=ini_host, port=ini_port) as smtp:  
        smtp.starttls()  
        smtp.login(  
                user = ini_from,  
                password = os.environ['MAIL_PASSWORD'],  
                )  
        msg = MIMEText(current_time)  
        msg['Subject'] = ini_title  
        msg['To'] = ini_to  
        msg['From'] = ini_from  

        smtp.send_message(  
                from_addr = ini_from,  
                to_addrs = ini_to.split(','),  
                msg = msg,  
                )  

if __name__ == '__main__':  
    visitmail( '2018/11/12 固定' )  

設定ファイル

(./config.ini)


[server]  
host = mail.hoge.co.jp  
port = 587  

[mail]  
from = [email protected]  
to = [email protected],[email protected]  
title = 呼出ブザーが押されました

systemd

(/etc/systemd/system/doorphone.service)


[Unit]  
Description=doorphone Daemon  

[Service]  
EnvironmentFile=/home/pi/.config/environment.d/doormail.conf  
WorkingDirectory=/home/pi/develop/doorphone  
ExecStart=/home/pi/develop/doorphone/control.py  
ExecStop=/bin/kill ${MAINPID}  
Restart=always  
Type=simple  
User=pi  
Group=pi  

[Install]  
WantedBy=multi-user.target  
記事が少しでもいいなと思ったらクラップを送ってみよう!
41
+1
@qPkJnEPdYTMgQPdyの技術ブログ

よく一緒に読まれている記事

0件のコメント

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

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする