pyztk/README.md

448 lines
11 KiB
Markdown
Raw Permalink Normal View History

2016-05-24 08:11:36 +07:00
# pyzk
2018-12-27 22:07:33 +07:00
[![Build Status](https://travis-ci.org/fananimi/pyzk.svg?branch=master)](https://travis-ci.org/fananimi/pyzk)
`pyzk` is an unofficial library of zksoftware (zkteco family) attendance machine.
2016-05-26 12:51:04 +07:00
2016-05-26 23:27:05 +07:00
# Installation
2018-12-27 22:07:33 +07:00
There is some installation method you can use below:
2018-08-21 20:00:46 +07:00
2018-12-27 22:07:33 +07:00
* pip
2018-08-21 20:00:46 +07:00
```sh
2018-12-27 17:51:43 +07:00
pip install -U pyzk
2018-08-21 20:00:46 +07:00
```
2018-06-13 21:14:21 +07:00
2018-12-27 22:07:33 +07:00
* manual installation (clone and execute)
2018-08-21 20:00:46 +07:00
```sh
python setup.py install
```
2018-06-13 21:14:21 +07:00
2018-12-27 22:07:33 +07:00
* clone and append the path of this project
2018-06-13 21:14:21 +07:00
```python
import sys
import os
sys.path.insert(1,os.path.abspath("./pyzk"))
from zk import ZK, const
```
2016-05-26 23:27:05 +07:00
2016-05-27 01:33:51 +07:00
# Documentation
2018-12-27 17:51:43 +07:00
Complete documentation can be found at [Readthedocs](http://pyzk.readthedocs.io/en/latest/ "pyzk's readthedocs") .
2016-05-27 01:33:51 +07:00
2018-12-27 17:51:43 +07:00
# API Usage
2016-05-26 12:51:04 +07:00
2018-12-27 17:51:43 +07:00
Create the ZK object and you will be ready to call api.
2016-05-26 12:51:04 +07:00
2018-12-27 22:07:33 +07:00
## Basic Usage
The following is an example code block how to use pyzk.
2018-10-02 23:01:50 +07:00
2018-05-04 02:58:52 +07:00
```python
2016-06-24 19:00:55 +07:00
from zk import ZK, const
2016-05-26 12:51:04 +07:00
2016-06-24 19:00:55 +07:00
conn = None
2018-12-27 22:07:33 +07:00
# create ZK instance
zk = ZK('192.168.1.201', port=4370, timeout=5, password=0, force_udp=False, ommit_ping=False)
2016-05-26 12:51:04 +07:00
try:
2018-12-27 22:07:33 +07:00
# connect to device
2018-12-27 17:57:00 +07:00
conn = zk.connect()
2018-12-27 22:07:33 +07:00
# disable device, this method ensures no activity on the device while the process is run
2018-12-27 17:57:00 +07:00
conn.disable_device()
2018-12-27 22:07:33 +07:00
# another commands will be here!
# Example: Get All Users
2018-12-27 17:57:00 +07:00
users = conn.get_users()
for user in users:
privilege = 'User'
if user.privilege == const.USER_ADMIN:
privilege = 'Admin'
2018-12-27 22:07:33 +07:00
print ('+ UID #{}'.format(user.uid))
2018-12-27 17:57:00 +07:00
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))
2018-12-27 22:07:33 +07:00
# Test Voice: Say Thank You
2018-12-27 17:57:00 +07:00
conn.test_voice()
2018-12-27 22:07:33 +07:00
# re-enable device after all commands already executed
2018-12-27 17:57:00 +07:00
conn.enable_device()
2018-05-04 02:58:52 +07:00
except Exception as e:
2018-12-27 17:57:00 +07:00
print ("Process terminate : {}".format(e))
2016-05-26 12:51:04 +07:00
finally:
2018-12-27 17:57:00 +07:00
if conn:
conn.disconnect()
2016-05-26 12:51:04 +07:00
```
2018-12-27 22:07:33 +07:00
## Command List
2016-06-17 13:54:05 +07:00
* Connect/Disconnect
2018-08-21 20:00:46 +07:00
```python
2016-06-24 19:00:55 +07:00
conn = zk.connect()
conn.disconnect()
2016-06-17 13:54:05 +07:00
```
* Disable/Enable Connected Device
2018-08-21 20:00:46 +07:00
```python
2018-12-27 22:07:33 +07:00
# disable (lock) device, to ensure no user activity in device while some process run
2016-06-24 19:00:55 +07:00
conn.disable_device()
2018-12-27 22:07:33 +07:00
# re-enable the connected device and allow user activity in device again
2016-06-24 19:00:55 +07:00
conn.enable_device()
2016-06-17 13:54:05 +07:00
```
2018-04-30 21:25:43 +07:00
* Get and Set Time
2018-08-21 20:00:46 +07:00
```python
2018-04-30 21:25:43 +07:00
from datetime import datetime
2018-12-27 17:51:43 +07:00
# get current machine's time
2018-04-30 21:25:43 +07:00
zktime = conn.get_time()
print zktime
2018-12-27 17:51:43 +07:00
# update new time to machine
2018-04-30 21:25:43 +07:00
newtime = datetime.today()
conn.set_time(newtime)
```
2018-12-27 22:07:33 +07:00
* Ger Firmware Version and Extra Information
2016-05-26 12:51:04 +07:00
2018-08-21 20:00:46 +07:00
```python
2016-06-24 19:00:55 +07:00
conn.get_firmware_version()
2018-04-30 21:25:43 +07:00
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()
```
2018-12-27 22:07:33 +07:00
* Get Device Usage Space
2018-04-30 21:25:43 +07:00
2018-05-04 02:58:52 +07:00
```python
2018-04-30 21:25:43 +07:00
conn.read_sizes()
print(conn)
#also:
conn.users
conn.fingers
conn.records
conn.users_cap
conn.fingers_cap
2018-12-27 17:51:43 +07:00
# TODO: add records_cap counter
# conn.records_cap
2016-05-26 12:51:04 +07:00
```
2016-06-17 13:54:05 +07:00
* User Operation
2016-05-26 12:51:04 +07:00
2018-05-04 02:58:52 +07:00
```python
2016-06-17 13:54:05 +07:00
# Create user
2018-04-30 21:25:43 +07:00
conn.set_user(uid=1, name='Fanani M. Ihsan', privilege=const.USER_ADMIN, password='12345678', group_id='', user_id='123', card=0)
2016-06-17 13:54:05 +07:00
# Get all users (will return list of User object)
2016-06-24 19:00:55 +07:00
users = conn.get_users()
2016-06-17 13:54:05 +07:00
# Delete User
2016-06-24 19:00:55 +07:00
conn.delete_user(uid=1)
2018-12-27 22:07:33 +07:00
conn.delete_user(user_id=123)
2016-05-26 12:51:04 +07:00
```
2018-04-30 21:25:43 +07:00
* Fingerprints
2018-05-04 02:58:52 +07:00
```python
2018-04-30 21:25:43 +07:00
# 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])
2018-10-30 09:04:15 +07:00
```
2016-05-26 12:51:04 +07:00
2018-03-01 16:56:09 +07:00
* Remote Fingerprint Enrollment
2018-10-30 09:04:15 +07:00
```python
2018-12-27 17:51:43 +07:00
zk.enroll_user('1')
# but it doesn't work with some tcp ZK8 devices
2018-04-30 21:25:43 +07:00
```
2016-05-26 12:51:04 +07:00
2016-06-17 13:54:05 +07:00
* Attendance Record
2018-12-27 17:51:43 +07:00
```python
2016-06-17 13:54:05 +07:00
# Get attendances (will return list of Attendance object)
2016-06-24 19:00:55 +07:00
attendances = conn.get_attendance()
2018-12-27 22:07:33 +07:00
# Clear attendances records
2016-06-24 19:00:55 +07:00
conn.clear_attendance()
2016-05-26 13:05:17 +07:00
```
2016-05-26 12:51:04 +07:00
* Test voice
2018-05-04 02:58:52 +07:00
```python
2018-12-27 17:51:43 +07:00
"""
2018-12-27 22:07:33 +07:00
play test voice:
0 Thank You
1 Incorrect Password
2 Access Denied
3 Invalid ID
4 Please try again
2019-04-25 16:49:44 +07:00
5 Dupicate ID
6 The clock is flow
2018-12-27 22:07:33 +07:00
7 The clock is full
8 Duplicate finger
2019-04-25 16:49:44 +07:00
9 Duplicated punch
10 Beep kuko
11 Beep siren
2018-12-27 22:07:33 +07:00
12 -
2019-04-25 16:49:44 +07:00
13 Beep bell
14 -
15 -
16 -
17 -
18 Windows(R) opening sound
19 -
20 Fingerprint not emolt
21 Password not emolt
22 Badges not emolt
23 Face not emolt
24 Beep standard
25 -
26 -
27 -
28 -
29 -
30 Invalid user
31 Invalid time period
32 Invalid combination
33 Illegal Access
34 Disk space full
35 Duplicate fingerprint
36 Fingerprint not registered
37 -
38 -
39 -
40 -
41 -
42 -
43 -
43 -
45 -
46 -
47 -
48 -
49 -
50 -
51 Focus eyes on the green box
52 -
53 -
54 -
55 -
2018-12-27 17:51:43 +07:00
"""
conn.test_voice(index=0) # will say 'Thank You'
2016-05-26 12:51:04 +07:00
```
2016-06-17 13:54:05 +07:00
* Device Maintenance
2016-05-26 12:51:04 +07:00
2018-05-04 02:58:52 +07:00
```python
2018-12-27 22:07:33 +07:00
# DANGER!!! This command will be erase all data in the device (incuded: user, attendance report, and finger database)
2018-12-27 17:51:43 +07:00
conn.clear_data()
2016-06-17 13:54:05 +07:00
# shutdown connected device
2018-12-27 17:51:43 +07:00
conn.poweroff()
2016-06-17 13:54:05 +07:00
# restart connected device
2016-06-24 19:00:55 +07:00
conn.restart()
2018-04-30 21:25:43 +07:00
# clear buffer
conn.free_data()
2016-05-26 12:55:18 +07:00
```
2018-05-26 04:26:41 +07:00
* Live Capture!
```python
# live capture! (timeout at 10s)
for attendance in conn.live_capture():
2018-12-27 22:07:33 +07:00
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
2018-05-26 04:26:41 +07:00
```
2018-09-13 20:47:49 +07:00
**Test Machine**
2018-05-04 02:58:52 +07:00
```sh
usage: ./test_machine.py [-h] [-a ADDRESS] [-p PORT] [-T TIMEOUT] [-P PASSWORD]
2018-12-27 22:07:33 +07:00
[-f] [-t] [-r] [-u] [-l] [-D DELETEUSER] [-A ADDUSER]
[-E ENROLLUSER] [-F FINGER]
2018-05-04 02:58:52 +07:00
ZK Basic Reading Tests
optional arguments:
2018-12-27 22:07:33 +07:00
-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)
2018-05-04 02:58:52 +07:00
```
2018-09-13 20:47:49 +07:00
**Backup/Restore (Users and fingers only!!!)** *(WARNING! destructive test! do it at your own risk!)*
```sh
usage: ./test_backup_restore.py [-h] [-a ADDRESS] [-p PORT] [-T TIMEOUT]
2018-12-27 22:07:33 +07:00
[-P PASSWORD] [-f] [-v] [-r]
[filename]
ZK Basic Backup/Restore Tool
positional arguments:
2018-12-27 22:07:33 +07:00
filename backup filename (default [serialnumber].bak)
optional arguments:
2018-12-27 22:07:33 +07:00
-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
-E, --erase clean the device after writting backup!
-r, --restore Restore from backup
-c, --clear-attendance
On Restore, also clears the attendance [default keep
attendance]
```
2018-12-27 17:51:43 +07:00
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
2018-12-27 17:51:43 +07:00
Firmware Version : Ver 6.60 Apr 9 2010
Platform : ZEM510_TFT
DeviceName : T4-C
2018-12-27 17:51:43 +07:00
Firmware Version : Ver 6.60 Dec 1 2010
Platform : ZEM510_TFT
DeviceName : T4-C
Firmware Version : Ver 6.60 Mar 18 2011
Platform : ZEM600_TFT
DeviceName : iClock260
2018-12-27 17:51:43 +07:00
Platform : ZEM560_TFT
Firmware Version : Ver 6.60 Feb 4 2012
DeviceName :
Firmware Version : Ver 6.60 Oct 29 2012
Platform : ZEM800_TFT
DeviceName : iFace402/ID
Firmware Version : Ver 6.60 Mar 18 2013
Platform : ZEM560
DeviceName : MA300
Firmware Version : Ver 6.60 Dec 27 2014
Platform : ZEM600_TFT
DeviceName : iFace800/ID
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)
2018-09-13 23:07:32 +07:00
Firmware Version : Ver 6.60 Jun 9 2017
Platform : JZ4725_TFT
DeviceName : K20 (latest checked correctly!)
Firmware Version : Ver 6.60 Aug 23 2014
Platform : ZEM600_TFT
DeviceName : VF680 (face device only, but we read the user and attendance list!)
Firmware Version : Ver 6.70 Feb 16 2017
Platform : ZLM30_TFT
DeviceName : RSP10k1 (latest checked correctly!)
Firmware Version : Ver 6.60 Jun 16 2015
Platform : JZ4725_TFT
DeviceName : K14 (tested & verified working as expected.)
2020-01-09 07:46:15 +07:00
Firmware Version : Ver 6.60 Jan 13 2016
Platform : ZMM220_TFT
DeviceName : iFace702 (without voice function, test with encoding='gbk')
```
### Latest tested (not really confirmed)
```
Firmware Version : Ver 6.60 Jun 16 2015
Platform : JZ4725_TFT
DeviceName : iClock260
2018-09-13 23:07:32 +07:00
Firmware Version : Ver 6.60 Jun 5 2015
Platform : ZMM200_TFT
DeviceName : iClock3000/ID (Active testing! latest fix)
2018-09-13 20:47:49 +07:00
Firmware Version : Ver 6.70 Jul 12 2013
Platform : ZEM600_TFT
DeviceName : iClock880-H/ID (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!
2016-05-26 12:55:18 +07:00
# Todo
2016-05-26 22:15:03 +07:00
* Create better documentation
* ~~Finger template downloader & uploader~~
2016-05-26 12:55:18 +07:00
* HTTP Rest api
* ~~Create real time api (if possible)~~
2016-06-17 13:54:05 +07:00
* and much more ...
2018-12-27 22:07:33 +07:00