東京都府中市、渋谷区のWEB制作会社Maromaroのブログです

2018.01.22

Sasaki

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;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;amp;amp; sejou_time &amp;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;amp;gt; File.dirname(__FILE__))

下記で実行できます。

sudo rubyファイル名.ruby start

raspi用の電源を壁内に用意する

壁内に設置してしまう前に、raspiの取り出しが楽な方法で動作検証をよくしましょう。 私は壁内に設置するため、既設のコンセントから増設しました。 下記のようにつなげましょう。(念のためブレーカーを落とすと安全です) また、Fケーブルはカッターなどで外皮だけ剥きましょう。(雑にやると芯が気づいてしまいます)

完成!

配線などもむき出しにならず、綺麗になりました。 設定がうまくいけば、slackに扉の施錠・解錠があると通知がくるはずです。 今回は電気錠の状態だけを取得していますが、コントロールも可能です。 なんとなくセキュリティ的によろしくないかな・・・と思って見送っていますが、 家の外からでも施錠、開錠させることも可能です! 以上、佐々木でした。