2018.01.22
Raspberry Pi Zero wで自宅の電気錠対応扉があけっぱなしだったらslack通知させる
こんにちは佐々木です。 今回はブログはRaspberry Pi Zero wを使って自宅の電気錠があけっぱなしだったら通知させる設定についてです。 実は、過去に扉を全開で仕事に出てしまったことがあり(汗、鍵をかけ忘れた時にどうにかしたいと思い制作しました。
仕様
扉が空いて一定時間が経つとSlackに通知 また、扉の施錠、開錠があっても通知 statusとslackで打ち込むと状態を返す 前提条件として、電気錠対応扉がすでに設置されているものとします。 また、「JEMA端子対応機器」を前提とします。(大概付いています)
制作に必要な物
- 電気錠対応扉(私はYKKAP製を利用)
- Raspberry Pi 今回私は、配線を壁の中に隠しておきたかったので、小型のZero wを選びましたが、どのRaspberry Piでも問題ないと思います。 [amazonjs asin=”B0746H9881″ locale=”JP” title=”Raspberry Pi Zero W Starter Kit”]
- 適当なブレッドボードか基盤(ケーブルも忘れないで) [amazonjs asin=”B00K67YFVM” locale=”JP” title=”SODIAL(R)5pcs両面5x7cmプリント基板ベロ試作トラックストリップボード”] [amazonjs asin=”B010SBSX4K” locale=”JP” title=”協和ハーモネット UL耐熱ビニル絶縁電線 黒白赤黄緑青茶 各2m UL1007 AWG24 2m <7>”]
- はんだこて(はんだも忘れないでね) [amazonjs asin=”B006MQD7M4″ locale=”JP” title=”白光 ダイヤル式温度制御はんだこて FX600″]
- ビニールテープ(配線をまとめる、壁内に固定する時に使いました) [amazonjs asin=”B002P8Q4UU” locale=”JP” title=”3Mスコッチ ビニルテープ スーパー No.88 耐熱難燃耐寒仕様 88 19X20″]
- 電源用コンセント+Fケーブル [amazonjs asin=”B002UNEN94″ locale=”JP” title=”パナソニック コスモワイド埋込ダブルコンセント WTP1502WKP”] [amazonjs asin=”B0027WVSKK” locale=”JP” title=”ELPA VVFケーブル 1.6mm^2*2芯 5m VA-5AH”]
Raspberry Piとコネクタの準備
raspiのGNDピンと14pinを使いました。 扉側のコネクタを基盤に接続し、モニタ信号の2線を利用します。 高側をGPIO14pinヘ、低側をGNDに接続します。 ※制御信号線を繋げて操作すれば、施錠・解錠も可能です。 下記参考 HA端子(JEM-A端子 JEM1427端子)概要
raspiにプログラムをいれる
私はrubyで下記のようにしました。(参考程度にお使いください) 事前に下記のコマンドで事前にrubyをインストール。 また、slackのAPIトークンの発行もしておきましょう。
gem installする
sudo gem install openssl sudo gem install pi_piper sudo gem install slack-ruby-client sudo gem install daemon_spawn
参考コード
require 'openssl' require 'pi_piper' include PiPiper require 'slack-ruby-client' require 'daemon_spawn' Slack.configure do |config| config.token = 'slackのAPIトークンをいれてください' end class Door &amp;amp;amp;amp;lt; DaemonSpawn::Base def start(args) $pin = Pin.new pin:14 realtime_client = Slack::RealTime::Client.new realtime_client.on :message do |data| if data['text'].include?('status') #slackでstatusと打つと施錠・解錠状態を返す if $pin.read == 1 realtime_client.message(channel: 'G8JCT928Z', text: "施錠されています。", as_user: true) else realtime_client.message(channel: 'G8JCT928Z', text: "解錠されています。", as_user: true) end end end realtime_client.start_async client = Slack::Web::Client.new client.auth_test client.chat_postMessage(channel: 'G8JCT928Z', text: "電気錠botが起動しました。", as_user: true) status = $pin.read sejou_time = Time.now.to_i #あけっぱなしの判定 while (1) new_status = $pin.read if new_status == 1 #施錠状態の時間を保存 sejou_time = Time.now.to_i elsif new_status == 0 &amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp; sejou_time &amp;amp;amp;amp;lt;= (Time.now.to_i - 300) #解錠されて、前回施錠から300秒たったら通知 client.chat_postMessage(channel: 'G8JCT928Z', text: "電気錠があけっぱなしですぞ!!", as_user: true) sejou_time = Time.now.to_i end if status != new_status status = new_status if status == 1 client.chat_postMessage(channel: 'G8JCT928Z', text: "電気錠が施錠されました。", as_user: true) else client.chat_postMessage(channel: 'G8JCT928Z', text: "電気錠が解錠されました。", as_user: true) end end sleep(2) end end def stop client = Slack::Web::Client.new client.chat_postMessage(channel: 'G8JCT928Z', text: "電気錠botが停止しました。", as_user: true) end end Door.spawn!(:working_dir =&amp;amp;amp;amp;gt; File.dirname(__FILE__))
下記で実行できます。
sudo rubyファイル名.ruby start
raspi用の電源を壁内に用意する
壁内に設置してしまう前に、raspiの取り出しが楽な方法で動作検証をよくしましょう。 私は壁内に設置するため、既設のコンセントから増設しました。 下記のようにつなげましょう。(念のためブレーカーを落とすと安全です) また、Fケーブルはカッターなどで外皮だけ剥きましょう。(雑にやると芯が気づいてしまいます)
完成!
配線などもむき出しにならず、綺麗になりました。 設定がうまくいけば、slackに扉の施錠・解錠があると通知がくるはずです。 今回は電気錠の状態だけを取得していますが、コントロールも可能です。 なんとなくセキュリティ的によろしくないかな・・・と思って見送っていますが、 家の外からでも施錠、開錠させることも可能です! 以上、佐々木でした。