{"id":1455,"date":"2018-12-18T22:26:27","date_gmt":"2018-12-18T13:26:27","guid":{"rendered":"https:\/\/www.rocher.kyoto.jp\/arbr\/?p=1455"},"modified":"2019-01-15T15:58:44","modified_gmt":"2019-01-15T06:58:44","slug":"raspberry-pi%e3%81%a7%e4%bd%9c%e3%81%a3%e3%81%9f%e7%8e%84%e9%96%a2%e3%81%ae%e5%91%bc%e3%81%b3%e5%87%ba%e3%81%97%e3%83%96%e3%82%b6%e3%83%bc%e3%81%abline%e9%80%9a%e7%9f%a5%e3%82%82%e4%bb%98%e3%81%91","status":"publish","type":"post","link":"https:\/\/www.rocher.kyoto.jp\/arbr\/?p=1455","title":{"rendered":"Raspberry Pi\u3067\u4f5c\u3063\u305f\u7384\u95a2\u306e\u547c\u3073\u51fa\u3057\u30d6\u30b6\u30fc\u306bLine\u901a\u77e5\u3082\u4ed8\u3051\u3066\u307f\u305f"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u6982\u8981<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u306e\u307e\u3048<a href=\"https:\/\/qiita.com\/YoshitakeKitamura\/items\/ce8a22addfd76f0d358e\">qiita<\/a>\u306b\u66f8\u3044\u305f\u30e1\u30fc\u30eb\u901a\u77e5\u304c\u3067\u304d\u308b\u7384\u95a2\u306e\u547c\u3073\u51fa\u3057\u30d6\u30b6\u30fc\u306bLine\u901a\u77e5\u3082\u4ed8\u3051\u3066\u307f\u305f\u306e\u3067\u305d\u306e\u30e1\u30e2\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u74b0\u5883<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">python3.7.0<br>\nraspbian9.4<br>\nRaspberry Pi B+<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u30d7\u30ed\u30b0\u30e9\u30e0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e8b\u524d\u6e96\u5099<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">requests\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u4f7f\u3046\u306e\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install requests<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u30bd\u30fc\u30b9<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u307b\u307c<a href=\"https:\/\/qiita.com\/analytics-hiro\/items\/e42f857bd6b40bc178a3\">\u3053\u3061\u3089<\/a>\u306e\u3068\u304a\u308a\u3002\u4ed6\u306b\u6307\u5b9a\u3067\u304d\u308b\u3082\u306e\u306f<a href=\"https:\/\/notify-bot.line.me\/doc\/ja\/\">\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/a>\u53c2\u7167\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">LINE_TOKEN\u306f\u74b0\u5883\u5909\u6570\u304b\u3089\u53d6\u5f97\u3002\u5f15\u6570\u306ecurrent_time\u306f\u547c\u3073\u51fa\u3057\u5143\u3067\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u6e08\u307f\u306e\u6587\u5b57\u5217<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(line_notify.py)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3\n# coding: utf-8\nimport os\n\nimport requests\n\ndef line_notify(current_time):\n    url = 'https:\/\/notify-api.line.me\/api\/notify'\n    token = os.environ['LINE_TOKEN']\n    headers = {\"Authorization\" : \"Bearer \"+ token}\n\n    message =  '\u547c\u51fa\u30d6\u30b6\u30fc\u304c\u62bc\u3055\u308c\u307e\u3057\u305f %s' % current_time\n    payload = {\"message\" :  message}\n\n    r = requests.post(url ,headers = headers ,params=payload)\n\nif __name__ == '__main__':\n    line_notify( '2018\/11\/12 \u56fa\u5b9a' )\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4ed6\u306e\u30bd\u30fc\u30b9\uff0f\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">(control.py)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u524d\u306e\u8a18\u4e8b\u3067\u306fwait_for_edge\u3067\u30dc\u30bf\u30f3\u30d7\u30c3\u30b7\u30e5\u3092\u691c\u77e5\u3057\u3066\u3044\u305f\u304c\u3001SIGINT\u304d\u3066\u3082\u51e6\u7406\u304c\u3068\u307e\u3089\u306a\u3044\u3068\u306e\u3053\u3068\u3067add_event_detect\u306b\u5909\u66f4<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u307e\u305f\u3001systemd\u306b\u767b\u9332\u3057\u305f\u306e\u3067signal\u3092\u30cf\u30f3\u30c9\u30e9\u3067\u51e6\u7406\u3059\u308b\u3088\u3046\u306b\u5909\u66f4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3\n# coding: utf-8\nfrom datetime import datetime\nfrom datetime import timedelta\nimport logging\nimport signal\nimport sys\nimport time\n\nimport RPi.GPIO as GPIO\n\nfrom mail import visitmail\nfrom line_notify import line_notify\n\ndef handler(signal, frame):\n    logger.info('break')\n    GPIO.cleanup()\n    sys.exit(0)\n\ndef callBuzzer(channel):\n    try:\n        # \u30ce\u30a4\u30ba\u5bfe\u7b56 \u9759\u96fb\u6c17\u7b49\u306e\u30ce\u30a4\u30ba\u3067\u306a\u3044\u304b0.1\u79d2\u4ee5\u4e0a\u7d9a\u3044\u3066\u3044\u308b\u3053\u3068\u3092\u30c1\u30a7\u30c3\u30af\n        time.sleep(0.1)\n        if GPIO.input(pin) == GPIO.LOW:\n\n            # \u9023\u7d9a\u30af\u30ea\u30c3\u30af\u5bfe\u5fdc \u4f55\u5ea6\u3082\u30e1\u30fc\u30eb\u304c\u98db\u3076\u3068\u9762\u5012\u306a\u306e\u3067\u4e00\u5b9a\u6642\u9593\u5185\u306e\u30dc\u30bf\u30f3\u30d7\u30c3\u30b7\u30e5\u306f\u7121\u8996\n            # \u30ce\u30a4\u30ba\u5bfe\u7b56\u306e\u524d\u306b\u7f6e\u304f\u3068\u3053\u306e\u51e6\u7406\u6642\u9593\u3067\u7d99\u7d9a\u6642\u9593\u304c\u9577\u304f\u306a\u3063\u3066\u3057\u307e\u3046\u306e\u3067\u3053\u306e\u51e6\u7406\u9806\u306b\u3057\u3066\u3044\u308b\n            global before_calltime\n            current_time = datetime.now()\n            if current_time &lt; (before_calltime + timedelta(seconds=60)):\n                logger.debug('callback yet')\n                return\n\n            logger.debug('before_calltime:%s current_time:%s'\n                % (before_calltime.strftime(\"%Y\/%m\/%d %H:%M:%S\"),current_time.strftime(\"%Y\/%m\/%d %H:%M:%S\")))\n            before_calltime = current_time\n\n            logger.info('visit actions call')\n            str_current_time = current_time.strftime(\"%Y\/%m\/%d %H:%M:%S\")\n            visitmail(str_current_time)\n            line_notify(str_current_time)\n    except Exception as e:\n        logger.error('error:  %s' % e)\n\nsignal.signal(signal.SIGINT, handler)\nsignal.signal(signal.SIGTERM, handler)\n\ntry:\n    formatter = '%(levelname)s : %(asctime)s : %(message)s'\n    logging.basicConfig(level = logging.INFO, filename = 'doorphone.log', format=formatter)\nexcept:\n    print >> sys.stderr, 'error: could not open log file'\n    sys.exit(1)\nlogger = logging.getLogger(__name__)\n#logger.setLevel(logging.DEBUG)\nloop_logger = logging.getLogger('loop_logger')\n#loop_logger.setLevel(logging.DEBUG)\n\nlogger.info('start doorphone moniter')\nbefore_calltime = datetime.now() - timedelta(seconds=60)\n\nGPIO.setmode(GPIO.BCM)\npin = 25\n\nGPIO.setup(pin, GPIO.IN,pull_up_down=GPIO.PUD_UP)\nGPIO.add_event_detect(pin, GPIO.FALLING, callback=callBuzzer, bouncetime=300)\n\nwhile True:\n    loop_logger.debug('main loop runnning')\n    time.sleep(1)\n\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u30e1\u30fc\u30eb\u9001\u4fe1\u51e6\u7406<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">(mail.py)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f15\u6570\u304b\u3048\u305f\u3050\u3089\u3044\u3067\u7279\u306b\u5909\u66f4\u306a\u3057<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3\n# coding: utf-8\nimport configparser\nfrom email.mime.text import MIMEText\nfrom smtplib import SMTP\nimport os\n\ndef visitmail(current_time):\n    inifile = configparser.ConfigParser()\n    inifile.read('.\/config.ini', 'UTF-8')\n\n    ini_host = inifile.get('server', 'host')\n    ini_port = inifile.get('server', 'port')\n    ini_from = inifile.get('mail', 'from')\n    ini_to = inifile.get('mail', 'to')\n    ini_title = inifile.get('mail', 'title')\n\n    with SMTP(host=ini_host, port=ini_port) as smtp:\n        smtp.starttls()\n        smtp.login(\n                user = ini_from,\n                password = os.environ['MAIL_PASSWORD'],\n                )\n        msg = MIMEText(current_time)\n        msg['Subject'] = ini_title\n        msg['To'] = ini_to\n        msg['From'] = ini_from\n\n        smtp.send_message(\n                from_addr = ini_from,\n                to_addrs = ini_to.split(','),\n                msg = msg,\n                )\n\nif __name__ == '__main__':\n    visitmail( '2018\/11\/12 \u56fa\u5b9a' )\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">(.\/config.ini)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[server]\nhost = mail.hoge.co.jp\nport = 587\n\n[mail]\nfrom = kitamura@hoge.co.jp\nto = kitamura@hoge.co.jp,keitaiaddr@ezweb.ne.jp\ntitle = \u547c\u51fa\u30d6\u30b6\u30fc\u304c\u62bc\u3055\u308c\u307e\u3057\u305f<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">systemd<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">(\/etc\/systemd\/system\/doorphone.service)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[Unit]\nDescription=doorphone Daemon\n\n[Service]\nEnvironmentFile=\/home\/pi\/.config\/environment.d\/doormail.conf\nWorkingDirectory=\/home\/pi\/develop\/doorphone\nExecStart=\/home\/pi\/develop\/doorphone\/control.py\nExecStop=\/bin\/kill ${MAINPID}\nRestart=always\nType=simple\nUser=pi\nGroup=pi\n\n[Install]\nWantedBy=multi-user.target\n<\/code><\/pre>\n\n\n<p>\u305d\u3046\u3044\u3048\u3070<a href=\"https:\/\/sanko-9211f.firebaseapp.com\/\">\u5ac1\u306e\u30b5\u30a4\u30c8<\/a>\u3092firebase\u306b\u6e96\u5099\u3057\u307e\u3057\u305f<\/p>","protected":false},"excerpt":{"rendered":"<p>\u6982\u8981 \u3053\u306e\u307e\u3048qiita\u306b\u66f8\u3044\u305f\u30e1\u30fc\u30eb\u901a\u77e5\u304c\u3067\u304d\u308b\u7384\u95a2\u306e\u547c\u3073\u51fa\u3057\u30d6\u30b6\u30fc\u306bLine\u901a\u77e5\u3082\u4ed8\u3051\u3066\u307f\u305f\u306e\u3067\u305d\u306e\u30e1\u30e2\u3002 \u74b0\u5883 python3.7.0 raspbian9.4 Raspberry Pi B+ \u30d7\u30ed\u30b0\u30e9\u30e0 \u4e8b\u524d\u6e96\u5099  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[113,100],"tags":[],"class_list":["post-1455","post","type-post","status-publish","format-standard","hentry","category-python","category-raspberrypi"],"_links":{"self":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/1455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1455"}],"version-history":[{"count":3,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/1455\/revisions"}],"predecessor-version":[{"id":1465,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/1455\/revisions\/1465"}],"wp:attachment":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}