Discuss DIY smart door lock in the UK Electrical Forum area at ElectriciansForums.net

By the time you’ve bought all the hardware needed…. Wouldn’t it be cheaper to use an off-the-counter solution?

don’t know if it’s been superseded yet, but a few years ago I fitted an ESP Fortessa system for caravan park toilet block access.
2 locks. One for main door, and other for disabled access. Dis cards did both doors, the rest only did main. Assigned each card to pitch number, turned access on and off when pitch was used/vacant.
Could time stamp each access to investigate when the door was opened in case of an incident. (Vandalism, or people taking dogs in for a shower… yeh, really)
Eventually changed the cards to key fob type as the cards got damaged easy. (Found them with holes punched through them for hanging on a lanyard!)
 
By the time you’ve bought all the hardware needed…. Wouldn’t it be cheaper to use an off-the-counter solution?

don’t know if it’s been superseded yet, but a few years ago I fitted an ESP Fortessa system for caravan park toilet block access.
2 locks. One for main door, and other for disabled access. Dis cards did both doors, the rest only did main. Assigned each card to pitch number, turned access on and off when pitch was used/vacant.
Could time stamp each access to investigate when the door was opened in case of an incident. (Vandalism, or people taking dogs in for a shower… yeh, really)
Eventually changed the cards to key fob type as the cards got damaged easy. (Found them with holes punched through them for hanging on a lanyard!)
I would like to know what card reading module you are using?
 
About this smart access control system, I have now completed it and I will make an update here.

brief introduction

The smart home is becoming more and more common with the development of technology, this article will focus on the security aspects of the intelligent access control project.

The principle of card reading: by driving the RFID-RC522 module, identify the ID card ID close to the ID card and then determine whether the ID exists in the database of the word typical, ID is the typical value of the word, if the existence of the verification through, and then print out the corresponding name, and then drive the electromagnetic lock in the same way.

Realized function

1. card registration.
2. username and password registration.
3. card swipe to unlock the electronic lock.
4. User name and password to unlock the electronic lock.

Connection diagram

connection.jpg

GUI design

GUI design.png

part of code

Python:
import mfrc522
import time
import _thread
from os import uname
from machine import Pin, UART
#from pyb import UART
#import machine

suos = Pin(32,Pin.OUT)
uart2 = UART(2, baudrate=115200, rx=16,tx=17,timeout=10)

ESP32_HSPI_CLOCK = 14
ESP32_HSPI_SLAVE_SELECT = 15
ESP32_HSPI_MISO = 12
ESP32_HSPI_MOSI = 13
ESP32_MFRC522_RST = 5

rx3 = []
rx_name = []
user_id_flag = False
password_flag = False
temp_id = ''
temp_mima = ''
personnel_id = {'zbw':[236,230,169,47],'lbw':[19,165,93,4]}
personnel_ps = {'zbw':'zbw3366','lbw':'lbwnb'}
admin_password = ('yyds')
button_cmd = [16,1]
edit1_cmd = [16,112]
edit2_cmd = [16,113]
edit3_cmd = [16,114]

if uname()[0] == 'esp32':
    rdr = mfrc522.MFRC522(ESP32_HSPI_CLOCK, ESP32_HSPI_MOSI, ESP32_HSPI_MISO, ESP32_MFRC522_RST, ESP32_HSPI_SLAVE_SELECT)

def do_write():
    try:
        (stat, tag_type) = rdr.request(rdr.REQIDL)
        if stat == rdr.OK:
            (stat, raw_uid) = rdr.anticoll()
            if stat == rdr.OK:
                print("New card detected")
                print("  - tag type: 0x%02x" % tag_type)
                print("  - uid : 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
                print("")
                if rdr.select_tag(raw_uid) == rdr.OK:
                    key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
                    if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
                        stat = rdr.write(8, b"\x00\x53\x00\x54\x00\x4F\x00\x4E\x00\x45\x0a\x0b\x0c\x0d\x0e\x0f")
                        rdr.stop_crypto1()
                        if stat == rdr.OK:
                            print("Data written to card")
                        else:
                            print("Failed to write data to card")
                    else:
                        print("Authentication error")
                else:
                    print("Failed to select tag")

    except KeyboardInterrupt:
        print("write error")


def do_read():
    while True:
        try:
            (stat, tag_type) = rdr.request(rdr.REQIDL)

            if stat == rdr.OK:
                (stat, raw_uid) = rdr.anticoll()
                if stat == rdr.OK:
                    print("New card detected")
                    print("  - tag type: 0x%02x" % tag_type)
                    print("  - uid   : 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
                    print (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
                    print("")
                    if rdr.select_tag(raw_uid) == rdr.OK:
                        key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
                        if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
                            print("Address 8 data: %s" % rdr.read(8))
                            for ps in personnel_id:
                                if raw_uid[0:4:1] == personnel_id.get(ps):
                                    suos.value(1)
                                    print(ps)
                                    uart_write(ps, *raw_uid[0:4:1])
                                    time.sleep(3)
                                    uart2.sendbreak()
                                    break
                            rdr.stop_crypto1()
                            time.sleep(3)
                            suos.value(0)
                        else:
                            print("Authentication error")
                    else:
                        print("Failed to select tag")
            if uart2.any()>1:
                rx2 = []
                data_name2 = ''
                bin_data = uart2.read(40)
                uart2.sendbreak()
                rx1 = list(bin_data)
                for item in rx1:
                    rx2.append(chr(item))
                print(rx2)
                if rx1[3:5:1] == button_cmd:
                    data_name_len = rx1[6] - 1
                    data_name = rx2[7:data_name_len+7:1]
                    data_name2 = ''.join(data_name)
                    print(data_name2)
                    if data_name2 == 'back3':
                        return
        except KeyboardInterrupt:
            print("read error")

def do_read2 (idd):
    print(idd)
    while True:
        try:
            (stat, tag_type) = rdr.request(rdr.REQIDL)

            if stat == rdr.OK:
                (stat, raw_uid) = rdr.anticoll()
                if stat == rdr.OK:
                    print("New card detected")
                    print("  - tag type: 0x%02x" % tag_type)
                    print("  - uid   : 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
                    print (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
                    print("")
                    if rdr.select_tag(raw_uid) == rdr.OK:
                        key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
                        if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
                            print("Address 8 data: %s" % rdr.read(8))
                            personnel_id[idd] = raw_uid[0:4:1]
                            uart_write3(*raw_uid[0:4:1])
                            rdr.stop_crypto1()
                        else:
                            print("Authentication error")
                    else:
                        print("Failed to select tag")
            if uart2.any()>1:
                rx2 = []
                data_name2 = ''
                bin_data = uart2.read(40)
                uart2.sendbreak()
                rx1 = list(bin_data)
                for item in rx1:
                    rx2.append(chr(item))
                if rx1[3:5:1] == button_cmd:
                    data_name_len = rx1[6] - 1
                    data_name = rx2[7:data_name_len+7:1]
                    data_name2 = ''.join(data_name)
                    print(data_name2)
                if data_name2 == 'back1':
                    return

        except KeyboardInterrupt:
            print("read error")

def uart_write(text, *ids):
#    print(text, *ids)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardname1","text":"'+str(text)+'"}>ET')
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid1","text":"'+str(ids)+'"}>ET')
    uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock1","visible":true}>ET')
    time.sleep(3)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardname1","text":"''"}>ET')
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid1","text":"''"}>ET')
    uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock1","visible":false}>ET')

def uart_write2(text,text2):
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'+text+'"}>ET')
    time.sleep(3)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'+text2+'"}>ET')
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit2","text":"''"}>ET')

def uart_write3(*id2):
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'+str(id2)+'"}>ET')
    time.sleep(3)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"''"}>ET')

def uart_write4(text,text2):
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"login","text":"'+text+'"}>ET')
    time.sleep(1)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"login","text":"'+text2+'"}>ET')
    time.sleep(1)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit3","text":"''"}>ET')
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit4","text":"''"}>ET')
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit7","text":"''"}>ET')

def uart_write5():
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'+str(id2)+'"}>ET')
    time.sleep(3)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"''"}>ET')

def card_zhuce():
    while True:
        if uart2.any():
            user_id = ''
            password = ''
            rx2 = []
            rx_num = 0
            bin_data = uart2.read(40)
            uart2.sendbreak()
            rx1 = list(bin_data)
            for item in rx1:
                rx2.append(chr(item))
                rx_num += 1
            data_end = rx_num-5
            data_id_st = rx2[8:13:1]
            data_id_st2 = ''.join(data_id_st)
            print(data_id_st2)
            if data_id_st2 == 'edit1':
                data_id_st3 = rx2[15:data_end:1]
                data_id_st4 = ''.join(data_id_st3)
                print(data_id_st4)
                if data_id_st4 != '':
                    name = True
            elif data_id_st2 == 'edit2':
                data_id_st5 = rx2[15:data_end:1]
                data_id_st6 = ''.join(data_id_st5)
                if data_id_st6 == admin_password:
                    admin = True
                    uart_write2('Verification passed!','Please place the card!')
                    do_read2(data_id_st4)
                    return

def mima_zuce():
    temp_id3 = ''
    temp_mima3 = ''
    while True:
        if uart2.any():
            user_id = ''
            password = ''
            rx2 = []
            rx_num = 0
#            data_end = 0
            bin_data = uart2.read(40)
            uart2.sendbreak()
            rx1 = list(bin_data)
            for item in rx1:
                rx2.append(chr(item))
                rx_num += 1
#                if (rx2[rx_num] == 'T') and (rx2[rx_num-1] == 'E') and (rx2[rx_num-2] == '>'):
#                    break
            data_end = rx_num-5
            data_id_st = rx2[8:13:1]
            data_id_st2 = ''.join(data_id_st)
            print(data_id_st2)
            if rx1[3:5:1] == button_cmd:
                data_name_len = rx1[6] - 1
                data_name = rx2[7:data_name_len+7:1]
                data_name2 = ''.join(data_name)
                print(data_name2)
                if data_name2 == 'back2':
                    return
            if data_id_st2 == 'edit3':
                data_id_st3 = rx2[15:data_end:1]
                data_id_st4 = ''.join(data_id_st3)
                print(data_id_st4)
                user_id_flag = True
                temp_id3 = data_id_st4
#                personnel_ps[temp_id] = raw_uid[0:4:1]
            elif data_id_st2 == 'edit4':
                data_id_st5 = rx2[15:data_end:1]
                data_id_st6 = ''.join(data_id_st5)
                print(data_id_st6)
#                if personnel_ps.get(temp_id) == data_id_st6:
                password_flag = True
                temp_mima3 = data_id_st6
#                    personnel_ps[temp_id] = password_flag

#            print(rx2,user_id_flag,password_flag)

            elif data_id_st2 == 'edit7':
                data_id_st5 = rx2[15:data_end:1]
                data_id_st6 = ''.join(data_id_st5)
                if (data_id_st6 == admin_password) and (password_flag == True) and (user_id_flag == True):
                    admin = True
                    personnel_ps[temp_id3] = temp_mima3
                    password_flag = False
                    user_id_flag = False
                    uart_write4('Verification passed!','login was successful!')


def password_loin():
    temp_id2 = ''
    temp_mima = ''
    while True:
        if uart2.any():
            user_id = ''
            password = ''
            rx2 = []
            rx_num = 0
#            data_end = 0
            bin_data = uart2.read(40)
            uart2.sendbreak()
            rx1 = list(bin_data)
            for item in rx1:
                rx2.append(chr(item))
                rx_num += 1
#                if (rx2[rx_num] == 'T') and (rx2[rx_num-1] == 'E') and (rx2[rx_num-2] == '>'):
#                    break
            data_end = rx_num-5
            data_id_st = rx2[8:13:1]
            data_id_st2 = ''.join(data_id_st)
            print(data_id_st2)
            if rx1[3:5:1] == button_cmd:
                data_name_len = rx1[6] - 1
                data_name = rx2[7:data_name_len+7:1]
                data_name2 = ''.join(data_name)
                print(data_name2)
                if data_name2 == 'back4':
                    return
            if data_id_st2 == 'edit5':
                data_id_st3 = rx2[15:data_end:1]
                data_id_st4 = ''.join(data_id_st3)
                print(data_id_st4)
                if data_id_st4 in personnel_ps:
                    user_id_flag = True
                    temp_id2 = data_id_st4
            elif data_id_st2 == 'edit6':
                data_id_st5 = rx2[15:data_end:1]
                data_id_st6 = ''.join(data_id_st5)
                print(data_id_st6)
                print(temp_id2)
                print(personnel_ps)
                if personnel_ps.get(temp_id2) == data_id_st6:
                    password_flag = True

#            print(rx2,user_id_flag,password_flag)
                    print(user_id_flag,password_flag)
                    if (password_flag == True) and (user_id_flag == True):
                        uart_write(temp_id2,temp_id2)
                        password_flag = False
                        user_id_flag = False
                        suos.value(1)
                        uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock2","visible":true}>ET')
                        uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit5","text":"''"}>ET')
                        uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit6","text":"''"}>ET')
                        time.sleep(3)
#                        uart_write('student','')
                        suos.value(0)
                        uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock2","visible":false}>ET')
                        uart2.sendbreak()

while True:
    if uart2.any()>1:
        rx2 = []
        data_name2 = ''
        bin_data = uart2.read(40)
#        time.sleep(1)
        uart2.sendbreak()
#        time.sleep(1)
        rx1 = list(bin_data)
        for item in rx1:
            rx2.append(chr(item))
        print(rx2)
        if rx1[3:5:1] == button_cmd:
            data_name_len = rx1[6] - 1
            data_name = rx2[7:data_name_len+7:1]
            data_name2 = ''.join(data_name)
            print(data_name2)
            if data_name2 == 'card1':
                card_zhuce()
            elif data_name2 == 'password1':
                mima_zuce()
            elif data_name2 == 'card2':
                do_read()
            elif data_name2 == 'password2':
                password_loin()

Video demo

 
I'm thinking about putting myself on a door with such a smart lock because I want my family to be even safer. This way, my children will see who is knocking on the door and not answer people who look suspicious, and I think that's great.
Many "smart" locks are insecure, don't go that route.

Yes, by all means put in a video / audio link so they can see who is at the door without opening it. Ideally one that you can also view remotely if needed.
 

Reply to DIY smart door lock in the UK Electrical Forum area at ElectriciansForums.net

Similar Threads

I bouught a Nissan Townstar EV and have found what I consider a theft problem All previous vans I have had allowed the driver to enter and exit...
Replies
3
Views
613
I'm installing mag-locks and fire door hold-open magnets at the moment and I'm wondering if any of the cable should be fire performance cable...
Replies
1
Views
582
  • Article
Electrical2Go - Home Security: Using Floodlights, CCTV, and Door Entry Systems In an era where technology is advancing rapidly, home security has...
Replies
0
Views
201
My best mate has been medically retired from the prison service at the young age of 52 and has time on his hands :D He's looking at a 'plug in'...
Replies
7
Views
397
Hi I'm trying to install smart start system in my mazda6 2009 gh tamura. But can't understand wiring diagrams. Trying to find negative door...
Replies
0
Views
899

OFFICIAL SPONSORS

Electrical Goods - Electrical Tools - Brand Names Electrician Courses Green Electrical Goods PCB Way Electrical Goods - Electrical Tools - Brand Names Pushfit Wire Connectors Electric Underfloor Heating Electrician Courses
These Official Forum Sponsors May Provide Discounts to Regular Forum Members - If you would like to sponsor us then CLICK HERE and post a thread with who you are, and we'll send you some stats etc

Electrical Forum

Welcome to the Electrical Forum at ElectriciansForums.net. The friendliest electrical forum online. General electrical questions and answers can be found in the electrical forum.
This website was designed, optimised and is hosted by Untold Media. Operating under the name Untold Media since 2001.
Back
Top
AdBlock Detected

We get it, advertisements are annoying!

Sure, ad-blocking software does a great job at blocking ads, but it also blocks useful features of our website. For the best site experience please disable your AdBlocker.

I've Disabled AdBlock