こんにちは、webデザイナーの山本です。
前編から少し日が空いてしまいましたが、後編をご紹介します。
また、当初は解錠だけのつもりでしたが施錠することもできたので、その方法でご紹介します。
▼前編の記事はこちら
▼2021/10/27追記:ICカードじゃなくてスマホタッチで解除できるようになったよ
今回やりたいこと
前回はラズパイのOSインストール方法を掲載しましたが、今回は実際にスマートロックを施錠・解錠する方法をご紹介します。
準備物
前回とほぼ同じですが、おおまかな内容にしました。
・有線マウス
・有線usbキーボード
・モニター
・wifi環境
・無線マウス(Bluetoothのほう) ※追加
・無線キーボード(Bluetoothのほう) ※追加・SESAMEのスマートロック本体
・SESAMEのwifiアクセスポイント
・ICカードリーダー(今回はSONYのNFCリーダーPaSoRi RC-S380)
・ICカード(今回はPiTaPaですが、SuicaやICOCAなどでもOK)
・
・microUSBケーブル
・USB電源タップ
・延長コード(ドアからコンセントまでの長さ)
上記にも記載しましたが、変換ケーブルわざわざ買ったけどよく考えたら必要ありませんね…!
何を思ったのかカードリーダーとラズパイ直接繋げれない…って勘違いしてました。
また、無線マウスとキーボードですが、実際作ってみたらわかるんですが、、、必要になります!!!!
最初からBluetoothのマウスとキーボードでラズパイの設定ができる強者はそもそも有線マウスとキーボードが必要なかったんですが、ド素人の私はそれができなかったので有線マウスとキーボードを使いました。
実際に完成したスマートロックを使うときはラズパイとカードリーダーを直接USBで繋ぐはずなので、増設用で使用したハブ繋ぐためのUSB穴がないんですよね。
そうなると、カードリーダーを起動させるためのコマンドをどうやって打ち込むんだ!ってなって、無線のマウスとキーボードが必要になるわけです。。
Bluetoothの接続は至って簡単なので問題はないと思います。
あとから、あれもこれもってなって申し訳ないです。
nfcpyをインストール
まずラズパイでICカードリーダーを動かせるようにするために、ICカードリーダーのドライバーをラズパイにインストールします。
ドライバーはCLI画面から簡単にインストールできます。
(CLI画面はメニューのアクセサリ > LXTerminalで立ち上がります。)
$ sudo pip install nfcpy
これだけ。
SESAME IDの取得
あなただけのSESAMEへ命令を出す必要あるので、SESAME IDを取得しておきます。
後々使うので、メモしておいてください。
取得方法は以下になります。
①SESAMEのダッシュボードへログイン
②Sesame Listをクリック
③自分のSesameのニックネームをクリック
④「version:」の上にあるIDをコピー
ICカードのIDを取得
①nfcpyのサンプルコードを入手
まずはICカードのIDを読み取るために、ブラウザ(chromium)を立ち上げて下記サイトからnfcpyのサンプルコードを入手します。
入手したらラズパイのデスクトップに保存しておきます。
そもそもブラウザ(chromium)が立ち上がらない場合
まさに私がそうだったんですが、わけわからずネットで調べたら、piのバージョンをアップデートしたら直ったって書いてあった記事があったので試しましたが直らず…
そこでド素人の私、ピンッ!ときて、単純にアンインストールして、もっかいインストールすれば直るのでは!?と思ってやってみました。
$ sudo apt-get autoremove chromium-browser
からの
$ sudo apt-get install chromium-browser
で普通にいけました。
②IDを取得する
ICカードリーダーとラズパイを繋いで、CLI画面から先程のサンプルコードを実行します。
$ sudo python2 /home/ユーザー名/デスクトップ/ncfpy-master/examples/tagtool.py
デスクトップに保存した場合のディレクトリになります。
ユーザー名はご自身ラズパイに合わせて変更してください。
(デフォルトだとpiだったと思う)
実行すると「waiting for a tag」みたいな文章がでると思います。
それがでたらICカードをカードリーダーにかざします。
するとIDが表示されるのでコピーしておきましょう。
Python2: can’t open file みたいなエラーが出る場合
下記のようなエラーが出る場合
Python2: can’t open file ‘examples/tagtool.py’:[Erroo 2] No such fike or directory
これまた私がそうだったんですが、ファイルが見つかりません的なメッセージが出ました。
結局、ディレクトリの階層が違っただけでした。
「Desktop」じゃなくて「デスクトップ」でいいの!?とかなったけど、合ってました。
ご自身の環境に合わせて記載してください。
SESAMEと連携する
まずは実際のコードを記載しておきますので「iccard.py」という名前でデスクトップに保存しましょう。
後で内容を説明します。
SESAMEのIDやパスワード、ICカードのID等は自分のものを記載してください。
# -*- coding: utf-8 -*-
import requests
import json
import binascii
import nfc
import time
from threading import Thread, Timer
# CANDY HOUSEのtokenの取得
url = "https://api.candyhouse.co/v1/accounts/login"
head = {"Content-type": "application/json"}
payload = {"email":"自分のメールアドレス", "password":"自分のパスワード"}
response = requests.post(url, headers=head, data=json.dumps(payload))
token = response.json()["authorization"]
# ICカード待ち受けの1サイクル秒
TIME_cycle = 1.0
# ICカード待ち受けの反応インターバル秒
TIME_interval = 0.2
# タッチされてから次を開始するまでの無効化する秒
TIME_wait = 3
# NFC接続リクエストのための準備
# 212F(FeliCa)で設定
target_req_ic = nfc.clf.RemoteTarget("212F")
# 0003(IC card)
target_req_ic.sensf_req = bytearray.fromhex("0000030000")
print 'ICカードをタッチしてください...'
while True:
# USB接続されたカードリーダーをインスタンス化
clf = nfc.ContactlessFrontend('usb')
# ICカード待ち受け開始
# clf.sense( [リモートターゲット], [検索回数], [検索の間隔] )
target_res = clf.sense(target_req_ic, iterations=int(TIME_cycle//TIME_interval)+1 , interval=TIME_interval)
if target_res != None:
tag = nfc.tag.activate_tt3(clf, target_res)
tag.sys = 3
#IDmを取り出す
idm = binascii.hexlify(tag.idm)
print 'Suica detected. idm = ' + idm
#ICカードのチェック
if (idm == "自分のICカードのID"):
headers = {'X-Authorization':token,}
response = requests.get('https://api.candyhouse.co/v1/sesames/自分のsesameのID', headers=headers)
status = response.json()["is_unlocked"]
# SESAMEを施錠解錠する
url_control = "https://api.candyhouse.co/v1/sesames/自分のsesameのID/control"
head_control = {"X-Authorization": token, "Content-type": "application/json"}
if(status == True):
payload_control = {"type":"lock"}
print("施錠しました")
else:
payload_control = {"type":"unlock"}
print("解錠しました")
#end if
response_control = requests.post(url_control, headers=head_control, data=json.dumps(payload_control))
print 'sleep ' + str(TIME_wait) + ' seconds'
time.sleep(TIME_wait)
#end if
clf.close()
#end while
そしてこのファイルをラズパイで以下のように実行します。
sudo python2 /home/ユーザー名/デスクトップ/iccard.py
実行すると「ICカードをタッチしてください」と出ると思うので、ICカードをかざして「施錠しました」「解錠しました」のどちらかが表示されたら完成です!
あとは玄関に設置して、コンセント繋いで、モニター外して…とかいろいろやることはありますが、頑張りましょう。
(おそらくこの時に、Bluetoothマウスいるやん!キーボードいるやん!てなります。)
コードはSESAME公式ブログを参考にしています。
CANDY HOUSEのtokenの取得(9行目)
自分のスマートロックと連携させるために、tokenという個別のIDのようなものを取得させるためのコードになります。
sesameにログインするときのご自分のメールアドレスとパスワードを入力してください。
ICカードのチェック(47行目)
最初に取り出したICカードのIDを入力してください。
私の場合ですが、最初にtagtool.pyでIDを取得したときは英語が大文字だったんですが、iccard.pyで取得したときはなぜか小文字になっていたので小文字で記載しています。
(例:123456789F00 → 123456789f00みたいな)
結果と感想
まずは結果をどうぞ。
分かりにくいですが施錠した状態から始まってます。
読み込ませてからの、ガチャッまでがちょっと長い…!小鳥もうるさい…!
何回かやって早いときもあるので、おそらく私の自宅のwifiのせいだと思います。
あと皆さんが一番思ったであろう見た目のダサさに関して言い訳させてください。
貼り付け方のセンスもさることながら、予定ではポストのフタ?カバー?越しにカードリーダーが反応するはずだったんですが、まさかの通らずでこんなことになってしまいました。
ICカードリーダーもSESAMEも誰も悪くない。私が悪い。笑
2019年中に公式から正式に出るらしいので、ぜひその際は電池式で出してほしいです。
充電式は電池の心配いらないけどコンセントの配線がキツイし見苦しい…
なにはともあれ完成してよかったです。
また、今回はAPIのバージョンはv1で作成しています。
最新はv3になるので、そちらで作成できる方はそちらのほうがよいです。
あと、SESAME自体は普通にすばらしい商品なので興味がある方は使ってみてください。
友達が早めに家に着いちゃったみたい…でも私ちょっと出ちゃってるし…みたいなことがあっても遠隔操作で開けれます。
彼氏に合鍵作ろうか迷う…ってときも遠隔操作はもちろん鍵のシェアもできるのでわざわざ作らなくて大丈夫です。
回し者みたいですね。違いますよ。
閲覧ありがとうございました。