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

  • TOP
  • ライフハック
  • Raspberry Pi Zero wで自宅の電気錠対応扉があけっぱなしだったらslack通知させる

2018.01.22

Sasaki

Raspberry Pi Zero wで自宅の電気錠対応扉があけっぱなしだったらslack通知させる

  • このエントリーをはてなブックマークに追加

こんにちは佐々木です。
今回はブログはRaspberry Pi Zero wを使って自宅の電気錠があけっぱなしだったら通知させる設定についてです。

実は、過去に扉を全開で仕事に出てしまったことがあり(汗、鍵をかけ忘れた時にどうにかしたいと思い制作しました。

仕様

扉が空いて一定時間が経つとSlackに通知
また、扉の施錠、開錠があっても通知
statusとslackで打ち込むと状態を返す

前提条件として、電気錠対応扉がすでに設置されているものとします。
また、「JEMA端子対応機器」を前提とします。(大概付いています)

制作に必要な物

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

下記で実行できます。

sudo rubyファイル名.ruby start

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

壁内に設置してしまう前に、raspiの取り出しが楽な方法で動作検証をよくしましょう。

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

完成!

配線などもむき出しにならず、綺麗になりました。

設定がうまくいけば、slackに扉の施錠・解錠があると通知がくるはずです。

今回は電気錠の状態だけを取得していますが、コントロールも可能です。
なんとなくセキュリティ的によろしくないかな・・・と思って見送っていますが、
家の外からでも施錠、開錠させることも可能です!

以上、佐々木でした。

  • このエントリーをはてなブックマークに追加