[PYTHON] Les clés de bureau WeWork peuvent maintenant être déverrouillées / verrouillées avec une carte IC en utilisant la serrure intelligente «SESAME mini» et Raspberry Pi Zero WH.

Nous sommes dans un bureau privé à WeWork. Les espaces communs tels que le salon dans le bâtiment peuvent être déverrouillés avec une carte IC pour les membres WeWork, mais j'étais un peu mécontent du fait que la clé du bureau était une clé physique. Ce serait pratique si la pièce pouvait être ouverte avec une carte IC.

Lorsque j'ai contacté le support WeWork pour trouver un moyen de le faire, j'ai entendu dire que certaines entreprises utilisent des serrures intelligentes disponibles dans le commerce, nous avons donc décidé de faire de même.

Présentation de Sesame mini

Des verrous dits intelligents, qui peuvent être fixés à la porte sans aucun travail de construction et peuvent être déverrouillés avec une application pour smartphone, sont disponibles auprès de divers fabricants.

Cependant, les clés du bureau privé de WeWork ont une forme légèrement spéciale (la largeur de la zone de montage est étroite, le bouton de rotation du pouce est fin), de sorte que toutes les serrures intelligentes ne peuvent pas être montées. Après de nombreuses recherches, j'ai décidé que Sesame mini irait bien, alors je l'ai acheté dans la boutique en ligne.

Les points décidés sont les suivants.

  1. La largeur compacte de 57 mm lui permet d'être attaché aux portes de bureaux privés
  2. Une imprimante 3D fabriquera un adaptateur pour n'importe quelle forme de clé.
  3. Vous pouvez continuer à utiliser la clé physique (nécessaire pour le nettoyage de nuit)
  4. Le prix est relativement bas et il n'y a pas de frais de fonctionnement

Surtout le deuxième point était un facteur décisif différent des autres. En fait, quand j'ai envoyé la photo de la clé par e-mail, il y a eu une réponse immédiatement et c'était la réponse de Dieu qu'il m'enverrait un adaptateur.

Grâce à cela, j'ai pu déverrouiller / verrouiller avec l'application pour smartphone en toute sécurité. sesame01.gif

C'était bien qu'il y ait du noir mat dans la variation de couleur. Cela fait du bien de faire correspondre la couleur de la porte.

Présentation de points d'accès WiFi Sesame supplémentaires

Sesame seul ne peut se connecter qu'à une application pour smartphone via Bluetooth, mais un [point d'accès WiFi] dédié (https://jp.candyhouse.co/blogs/how-to/wifi%E3%82%A2%E3%82%AF%] E3% 82% BB% E3% 82% B9% E3% 83% 9D% E3% 82% A4% E3% 83% B3% E3% 83% 88% E3% 81% A7% E9% 81% A0% E9% 9A% 94% E6% 93% 8D% E4% BD% 9C% E3% 82% 92% E5% 8F% AF% E8% 83% BD% E3% 81% AB% E3% 81% 99% E3% 82% Avec l'ajout de 8B), vous pourrez accéder au sésame installé dans votre bureau de n'importe où dans le monde avec une connexion Internet.

De plus, Sesame est l'API est ouverte, vous pouvez donc le personnaliser vous-même.

Il est beaucoup plus pratique qu'avant de pouvoir fonctionner avec une application pour smartphone au lieu d'une clé physique, mais l'idéal est de pouvoir ouvrir et fermer d'une simple pression sur une carte IC. Un point d'accès WiFi est indispensable pour cela, je l'ai donc acheté en plus.

Configuration de la tarte à la râpe et du lecteur de carte IC

Raspberry Pi est utilisé pour lire la carte IC et faire fonctionner l'API. Il y avait déjà un article utile, donc j'ai généralement suivi cette procédure.

Tout d'abord, préparez l'équipement nécessaire. Je les ai tous achetés sur Amazon.

Ensuite, j'ai procédé à la configuration en fonction du contenu de l'article ci-dessus, mais comme je n'avais pas de hub USB, de souris et de clavier, j'ai décidé de le faire fonctionner via WiFi en me référant à l'article suivant.

Les étapes ci-dessus ne tiennent pas beaucoup compte de la sécurité, alors faisons-le correctement. C'est un bureau partagé où différentes personnes sont mélangées.

Lisez la carte IC WeWork et utilisez l'API Sesame

Eh bien, si vous suivez l'article sur la manipulation du sésame avec la tarte à la râpe précédente, c'est généralement OK, mais il y a certaines parties qui ne vont pas bien comme ça. ** La carte de WeWork n'est pas Suica ** et ** la version de l'API utilisée dans l'article est ancienne **.

J'ai donc corrigé la partie qui ne fonctionnait pas et terminé le code suivant. La version actuelle de l'API nécessite une clé API. Comment obtenir la clé API est décrit dans ici.

SesameNFC.py


# -*- coding: utf-8 -*-
import requests
import json
import binascii
import nfc
import time
import traceback
from threading import Thread, Timer

#1 cycle seconde de veille de la carte IC
TIME_cycle = 1.0
#Intervalle de réaction de veille de la carte IC secondes
TIME_interval = 0.2
#Désactiver les secondes du toucher pour commencer le suivant
TIME_wait = 3

#SESAME API KEY
API_key = "Clé API Sesame"

#Préparation de la demande de connexion NFC
# 106A(NFC type A)Fixé avec
target_req_nfc = nfc.clf.RemoteTarget("106A")

print 'Veuillez toucher la carte IC...'
while True:
    try:
        #Instancier un lecteur de carte connecté par USB
        clf = nfc.ContactlessFrontend('usb')
        #Démarrage en veille de la carte IC
        # clf.sense( [Cible distante], [Nombre de recherches], [Intervalle de recherche] )
        target_res = clf.sense(target_req_nfc, iterations=int(TIME_cycle//TIME_interval)+1 , interval=TIME_interval)

        if target_res != None:

            tag = nfc.tag.activate(clf, target_res)

            #Extraire l'ID
            idm = binascii.hexlify(tag.identifier).upper()
            print 'NFC detected. ID = ' + idm

            #Vérification de la carte IC
            if (idm == "tagtool.ID récupéré par py"):
                url_control = "https://api.candyhouse.co/public/sesame/ID du terminal Sesame"
                head_control = {"Authorization": API_key, "Content-type": "application/json"}
                # get status
                response_control = requests.get(url_control, headers=head_control)
                #Une erreur se produira-t-elle si l'intervalle est court jusqu'à la prochaine demande? Alors attendez quelques secondes
                time.sleep(1)
                res = json.loads(response_control.text)
                stats = res["locked"]

                if (stats == True):
                    # unlock
                    payload_control = {"command":"unlock"}
                    response_control = requests.post(url_control, headers=head_control, data=json.dumps(payload_control))

                else:
                    # lock
                    payload_control = {"command":"lock"}
                    response_control = requests.post(url_control, headers=head_control, data=json.dumps(payload_control))

                print(response_control.text)
                print 'sleep ' + str(TIME_wait) + ' seconds'
                time.sleep(TIME_wait)

            #end if
        #end if

        clf.close()
    #end try

    except KeyboardInterrupt:
        print("Ctrl+Arrêté à C")
        clf.close()
        break

    except:
        clf.close()
        traceback.print_exc()
        pass

#end while

Vous pouvez maintenant déverrouiller / verrouiller le sésame avec la carte IC WeWork! sesame02.gif

La marque sur le lecteur de carte IC a été retournée à cause de la fente d'insertion du câble, alors j'ai mis un autocollant WeWork dessus pour tricher. En conséquence, cela ressemble à un article officiel et n'est-ce pas beau?

Carte IC tactile, déverrouillage / verrouillage, LED clignotante en cas d'erreur

Cela fonctionne pour le moment, mais en fait, ce code échoue souvent à se déverrouiller / se verrouiller avec une erreur. Apparemment, la réponse de l'API ou du point d'accès WiFi peut être retardée, donc si vous le faites sérieusement, vous devriez incorporer le traitement des nouvelles tentatives, mais si vous le touchez à nouveau, cela fonctionnera généralement, donc ça va ... Je suis.

Au lieu de cela, la LED clignote pour chaque événement. Vous pouvez dire quel processus a été fait par le motif clignotant, et surtout, L Chika est la route royale si vous faites du razz pie!

Je me suis référé à l'article suivant pour savoir comment faire clignoter la LED. Comment faire Python3 L Chika (LED clignotante) avec Raspberry Pi Zero WH

Et le code qui intègre L Chika est le suivant.

SesameNFC_LED.py


# -*- coding: utf-8 -*-
import requests
import json
import binascii
import nfc
import time
import traceback
import RPi.GPIO as GPIO
from threading import Thread, Timer

#1 cycle seconde de veille de la carte IC
TIME_cycle = 1.0
#Intervalle de réaction de veille de la carte IC secondes
TIME_interval = 0.2
#Désactiver les secondes du toucher pour commencer le suivant
TIME_wait = 3

#SESAME API KEY
API_key = "Clé API Sesame"

#Préparation de la demande de connexion NFC
# 106A(NFC type A)Fixé avec
target_req_nfc = nfc.clf.RemoteTarget("106A")

print 'Veuillez toucher la carte IC...'
while True:
    try:
        #Instancier un lecteur de carte connecté par USB
        clf = nfc.ContactlessFrontend('usb')
        #Démarrage en veille de la carte IC
        # clf.sense( [Cible distante], [Nombre de recherches], [Intervalle de recherche] )
        target_res = clf.sense(target_req_nfc, iterations=int(TIME_cycle//TIME_interval)+1 , interval=TIME_interval)

        if target_res != None:

            tag = nfc.tag.activate(clf, target_res)

            #Extraire l'ID
            idm = binascii.hexlify(tag.identifier).upper()
            print 'NFC detected. ID = ' + idm

            #Vérification de la carte IC
            if (idm == "tagtool.ID lu par py"):

                #Définir le mode de spécification du numéro GPIO(BCM:Numéro de broche de rôle, CARTE:Code PIN)
                GPIO.setmode(GPIO.BCM)
                #Configuré pour utiliser la broche 23 (LED verte) comme sortie
                GPIO.setup(23, GPIO.OUT)
                #Clignotant
                for i in range(3):
                    GPIO.output(23, GPIO.HIGH)
                    time.sleep(0.5)
                    GPIO.output(23, GPIO.LOW)
                    time.sleep(0.5)
                #Réinitialiser les paramètres GPIO
                GPIO.cleanup()

                url_control = "https://api.candyhouse.co/public/sesame/ID du terminal Sesame"
                head_control = {"Authorization": API_key, "Content-type": "application/json"}
                # get status
                response_control = requests.get(url_control, headers=head_control)
                #Une erreur se produira-t-elle si l'intervalle est court jusqu'à la prochaine demande? Alors attendez quelques secondes
                time.sleep(1)
                res = json.loads(response_control.text)
                stats = res["locked"]

                if (stats == True):
                    # unlock
                    payload_control = {"command":"unlock"}
                    response_control = requests.post(url_control, headers=head_control, data=json.dumps(payload_control))
                    #La LED verte s'allume lorsqu'elle est déverrouillée
                    GPIO.setmode(GPIO.BCM)
                    GPIO.setup(23, GPIO.OUT)
                    GPIO.output(23, GPIO.HIGH)
                    time.sleep(3)
                    GPIO.output(23, GPIO.LOW)
                    GPIO.cleanup()

                else:
                    # lock
                    payload_control = {"command":"lock"}
                    response_control = requests.post(url_control, headers=head_control, data=json.dumps(payload_control))
                    #La LED verte clignote rapidement lorsqu'elle est verrouillée
                    GPIO.setmode(GPIO.BCM)
                    GPIO.setup(23, GPIO.OUT)
                    for i in range(6):
                        GPIO.output(23, GPIO.HIGH)
                        time.sleep(0.25)
                        GPIO.output(23, GPIO.LOW)
                        time.sleep(0.25)
                    GPIO.cleanup()

                print(response_control.text)

                print 'sleep ' + str(TIME_wait) + ' seconds'
                time.sleep(TIME_wait)

            #end if
        #end if

        clf.close()
    #end try

    except KeyboardInterrupt:
        print("Ctrl+Arrêté à C")
        clf.close()
        #Clignote violemment la LED rouge (broche 22) lorsqu'une erreur se produit
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(22, GPIO.OUT)
        for i in range(10):
            GPIO.output(22, GPIO.HIGH)
            time.sleep(0.1)
            GPIO.output(22, GPIO.LOW)
            time.sleep(0.1)
        GPIO.cleanup()
        break

    except:
        clf.close()
        GPIO.cleanup()
        traceback.print_exc()
        #Clignote violemment la LED rouge en cas d'erreur
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(22, GPIO.OUT)
        for i in range(20):
            GPIO.output(22, GPIO.HIGH)
            time.sleep(0.1)
            GPIO.output(22, GPIO.LOW)
            time.sleep(0.1)
        GPIO.cleanup()
        pass

#end while

…… C'est un code maladroit que je viens de faire fonctionner pour le moment, mais cela ne gêne pas mon travail, donc je le laisse intact.

Pouvez-vous voir la LED clignoter sur le bureau? Seulement à ce moment, j'étais reconnaissant pour la paroi en verre de WeWork. Il aurait été plus gênant d'installer un lecteur de carte IC et une LED sur un mur ordinaire. sesame03.gif

en conclusion

De cette manière, nous avons pu répondre au désir de déverrouiller et de verrouiller la pièce avec la carte IC de WeWork.

En raison du mauvais code et de la lenteur de la réponse de l'API et du point d'accès WiFi, ** le déverrouillage / verrouillage échoue souvent ** ou ** cela prend quelques secondes entre le toucher et le déverrouillage / verrouillage **. Bien qu'il y en ait, ce n'est pas grave car le nombre de personnes et la fréquence d'utilisation ne sont pas si élevés. Bumpy, c'est bien si je suis à l'aise.

En conséquence, je suis très heureux d'être libéré des clés physiques et des opérations sur smartphone et de pouvoir passer librement de l'espace commun au bureau privé avec une carte IC. Je suis heureux.

Recommended Posts

Les clés de bureau WeWork peuvent maintenant être déverrouillées / verrouillées avec une carte IC en utilisant la serrure intelligente «SESAME mini» et Raspberry Pi Zero WH.
J'ai fait un package npm pour obtenir l'ID de la carte IC avec Raspberry Pi et PaSoRi