Go to file
2018-09-03 20:00:30 -04:00
.github/ISSUE_TEMPLATE Update issue templates 2018-07-27 17:37:05 -04:00
docs release app version 5.0 2016-07-17 13:40:16 +07:00
zk backup file changed from pickle to json (for python2&3 support) 2018-09-03 20:00:30 -04:00
.gitignore minor fixes, backup generator (TODO: restorer) 2018-08-30 16:31:49 -04:00
.travis.yml update test 2016-05-30 09:59:39 +07:00
basic_test.py added some unittests (and moved basic test) 2018-06-13 15:23:21 -04:00
CHANGELOG.md added future to install 2018-04-30 09:33:17 -04:00
LICENSE add installer 2016-05-26 23:04:37 +07:00
LICENSE.txt add installer 2016-05-26 23:04:37 +07:00
README.md missing back restore doc, and clear_attendance flag 2018-09-03 17:53:04 -04:00
setup.py fix setup.py version 2018-04-30 10:32:10 -04:00
test_backup_restore.py backup file changed from pickle to json (for python2&3 support) 2018-09-03 20:00:30 -04:00
test_machine.py minor fixes, backup generator (TODO: restorer) 2018-08-30 16:31:49 -04:00
test_voice.py fixed reading tcp bug 2018-05-03 15:58:52 -04:00
test.py restore working with pickle! (can't share data between python versions) 2018-09-03 17:42:16 -04:00
zk6.lua fixed tcp read_chunk nad improved dissector 2018-05-25 16:44:38 -04:00

pyzk

pyzk is an unofficial library of zksoftware the fingerprint attendance machine.

Installation

Build Status

replace original pyzk, if it was installed

pip install -U git+https://github.com/kurenai-ryu/pyzk.git

or using pipenv:

pipenv install git+https://gith.com/kurenai-ryu/pyzk#egg=pyzk

or clone and execute:

python setup.py install

or in your project, append the path of this project

import sys
import os
sys.path.insert(1,os.path.abspath("./pyzk"))
from zk import ZK, const

Documentation

Complete documentation of the original project can be found at Readthedocs .

Api Usage

Just create a ZK object and you will be ready to call api.

  • Basic Usage
from zk import ZK, const

conn = None
zk = ZK('192.168.1.201', port=4370, timeout=5, password=0, force_udp=False, ommit_ping=False)
try:
    print ('Connecting to device ...')
    conn = zk.connect()
    print ('Disabling device ...')
    conn.disable_device()
    print ('Firmware Version: : {}'.format(conn.get_firmware_version()))
    # print '--- Get User ---'
    users = conn.get_users()
    for user in users:
        privilege = 'User'
        if user.privilege == const.USER_ADMIN:
            privilege = 'Admin'

        print ('- UID #{}'.format(user.uid))
        print ('  Name       : {}'.format(user.name))
        print ('  Privilege  : {}'.format(privilege))
        print ('  Password   : {}'.format(user.password))
        print ('  Group ID   : {}'.format(user.group_id))
        print ('  User  ID   : {}'.format(user.user_id))

    print ("Voice Test ...")
    conn.test_voice()
    print ('Enabling device ...')
    conn.enable_device()
except Exception as e:
    print ("Process terminate : {}".format(e))
finally:
    if conn:
        conn.disconnect()
  • Connect/Disconnect
conn = zk.connect()
conn.disconnect()
  • Disable/Enable Connected Device
conn.disable_device()
conn.enable_device()
  • Get and Set Time
from datetime import datetime

zktime = conn.get_time()
print zktime

newtime = datetime.today()
conn.set_time(newtime)
  • Ger Firmware Version and extra information
conn.get_firmware_version()
conn.get_serialnumber()
conn.get_platform()
conn.get_device_name()
conn.get_face_version()
conn.get_fp_version()
conn.get_extend_fmt()
conn.get_user_extend_fmt()
conn.get_face_fun_on()
conn.get_compat_old_firmware()
conn.get_network_params()
conn.get_mac()
conn.get_pin_width()
  • Get Device use and free Space
conn.read_sizes()
print(conn)
#also:
conn.users
conn.fingers
conn.records
conn.users_cap
conn.fingers_cap
conn.records_cap
  • User Operation
# Create user
conn.set_user(uid=1, name='Fanani M. Ihsan', privilege=const.USER_ADMIN, password='12345678', group_id='', user_id='123', card=0)
# Get all users (will return list of User object)
users = conn.get_users()
# Delete User
conn.delete_user(uid=1)

there is also an enroll_user() (but it doesn't work with some tcp ZK8 devices)

  • Fingerprints
# Get  a single Fingerprint (will return a Finger object)
template = conn.get_user_template(uid=1, temp_id=0) #temp_id is the finger to read 0~9
# Get all fingers from DB (will return a list of Finger objects)
fingers = conn.get_templates()

# to restore a finger, we need to assemble with the corresponding user
# pass a User object and a list of finger (max 10) to save

conn.save_user_template(user, [fing1 ,fing2])
  • Attendance Record
# Get attendances (will return list of Attendance object)
attendances = conn.get_attendance()
# Clear attendances record
conn.clear_attendance()
  • Test voice
conn.test_voice(index=10) # beep or chirp
  • Device Maintenance
# shutdown connected device
conn.power_off()
# restart connected device
conn.restart()
# clear buffer
conn.free_data()
  • Live Capture!
# live capture! (timeout at 10s)
for attendance in conn.live_capture():
    if attendance is None:
        # implement here timeout logic
        pass
    else:
        print (attendance) # Attendance object
    #
    #if you need to break gracefully just set
    #   conn.end_live_capture = True
    #
    # On interactive mode,
    # use Ctrl+C to break gracefully
    # this way it restores timeout
    # and disables live capture

Test Machine

usage: ./test_machine.py [-h] [-a ADDRESS] [-p PORT] [-T TIMEOUT] [-P PASSWORD]
                         [-f] [-t] [-r] [-u] [-l] [-D DELETEUSER] [-A ADDUSER]
                         [-E ENROLLUSER] [-F FINGER]

ZK Basic Reading Tests

optional arguments:
  -h, --help            show this help message and exit
  -a ADDRESS, --address ADDRESS
                        ZK device Address [192.168.1.201]
  -p PORT, --port PORT  ZK device port [4370]
  -T TIMEOUT, --timeout TIMEOUT
                        Default [10] seconds (0: disable timeout)
  -P PASSWORD, --password PASSWORD
                        Device code/password
  -b, --basic           get Basic Information only. (no bulk read, ie: users)
  -f, --force-udp       Force UDP communication
  -v, --verbose         Print debug information
  -t, --templates       Get templates / fingers (compare bulk and single read)
  -tr, --templates-raw  Get raw templates (dump templates)
  -r, --records         Get attendance records
  -u, --updatetime      Update Date/Time
  -l, --live-capture    Live Event Capture
  -o, --open-door       Open door

  -D DELETEUSER, --deleteuser DELETEUSER
                        Delete a User (uid)
  -A ADDUSER, --adduser ADDUSER
                        Add a User (uid) (and enroll)
  -E ENROLLUSER, --enrolluser ENROLLUSER
                        Enroll a User (uid)
  -F FINGER, --finger FINGER
                        Finger for enroll (fid=0)

Backup/Restore (Users and fingers only!!!) (WARNING! destructive test! do it at your own risk!)

usage: ./test_backup_restore.py [-h] [-a ADDRESS] [-p PORT] [-T TIMEOUT]
                              [-P PASSWORD] [-f] [-v] [-r]
                              [filename]

ZK Basic Backup/Restore Tool

positional arguments:
  filename              backup filename (default [serialnumber].bak)

optional arguments:
  -h, --help            show this help message and exit
  -a ADDRESS, --address ADDRESS
                        ZK device Address [192.168.1.201]
  -p PORT, --port PORT  ZK device port [4370]
  -T TIMEOUT, --timeout TIMEOUT
                        Default [10] seconds (0: disable timeout)
  -P PASSWORD, --password PASSWORD
                        Device code/password
  -f, --force-udp       Force UDP communication
  -v, --verbose         Print debug information
  -r, --restore         Restore from backup
  -c, --clear-attendance
                        On Restore, also clears the attendance [default keep
                        attendance]

to restore on a different device, make sure to specify the filename. on restoring, it asks for the serial number of the destination device (to make sure it was correct, as it deletes all data) WARNING. there is no way to restore attendance data, you can keep it or clear it, but once cleared, there is no way to restore it.

Compatible devices

Firmware Version : Ver 6.21 Nov 19 2008
Platform : ZEM500
DeviceName : U580

Firmware Version : Ver 6.60 Oct 29 2012
Platform : ZEM800_TFT
DeviceName : iFace402/ID

Firmware Version : Ver 6.60 Dec 27 2014
Platform : ZEM600_TFT
DeviceName : iFace800/ID

Firmware Version : Ver 6.60 Mar 18 2013
Platform : ZEM560
DeviceName : MA300

Firmware Version : Ver 6.60 Dec 1 2010
Platform : ZEM510_TFT
DeviceName : T4-C

Firmware Version : Ver 6.60 Apr 9 2010
Platform : ZEM510_TFT
DeviceName : T4-C

Firmware Version : Ver 6.60 Mar 18 2011
Platform : ZEM600_TFT
DeviceName : iClock260

Firmware Version : Ver 6.60 Nov 6 2017 (remote tested with correct results)
Platform : ZMM220_TFT
DeviceName : (unknown device) (broken info but at least the important data was read)

Latest tested (not really confirmed)

Firmware Version : Ver 6.60 Jun 16 2015
Platform : JZ4725_TFT
DeviceName : iClock260

Firmware Version : Ver 6.60 Jun 16 2015
Platform : JZ4725_TFT
DeviceName : K14 (not tested, but same behavior like the other one)

Firmware Version : Ver 6.60 Jun 9 2017
Platform : JZ4725_TFT
DeviceName : K20 (Active testing! latest fix)

Not Working (needs more tests, more information)

Firmware Version : Ver 6.4.1 (build 99) (display version 2012-08-31)
Platform : 
DeviceName : iClock260 (no capture data - probably similar problem as the latest TESTED)

If you have another version tested and it worked, please inform me to update this list!

Related Project

Related Project (TODO: check compatibility with this fork)

  • Driji is an attendance apps based fingerprint for school

Todo

  • Create better documentation
  • Finger template downloader & uploader
  • HTTP Rest api
  • Create real time api (if possible)
  • and much more ...