概要
このまえ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 = kitamura@hoge.co.jp
to = kitamura@hoge.co.jp,keitaiaddr@ezweb.ne.jp
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
そういえば嫁のサイトをfirebaseに準備しました