Package: zkaccess-c3
C3A native Python library for communicating with the ZKTeco ZKAccess C3 Access Control Panels.This library intends to implement the same functionality as provided by the ZKAccess C3 PullSDK API, but using native Python only.UsageTo use the library, import the main class:from c3 import C3A panel connection can be created from the main classC3:panel = C3(ip)
    if panel.connect():
      panel.get_device_param(["~SerialNumber", "LockCount")To use the real-time log (RTLog), or control outputs, also include the helper classes fromcontroldeviceandrtlog.Compatible devicesThe following devices are tested and known compatible:C3-200 (firmware AC Ver 4.1.9 4609-03 Apr 7 2016)C3-400 (firmware AC Ver 4.3.4 Apr 27 2017)C3-400 (firmware AC Ver 5.4.3.2001 Sep 25 2019)inBio 460 (firmware AC Ver 5.0.9 4609-06 - Sep 15 2017) (probably 260 and 160 also work)ProtocolThe C3 access panels communicate using RS485 or TCP/IP.
This library only support TCP/IP connections using IPv4.
The connection is optionally secured by a password.The wire protocol for the access panels is binary, with the following datagram both for requests (from client to equipment) and responses:Byte012345,6,7,8, ...n-2, n-1nMeaningStartVersionCommandLength LSBLength MSBDataChecksumEndValue0xAA0x010x55The start bytes 0, 1 and last byte have a fixed value.TheCommandis one of the following (only listing commands supported by this library)CodeCommand0x01Connect (without session initiation)0x76Connect (session initiation)0x02Disconnection (session end)0x05Device control command0x0BRetrieve realtime log0xC8Response (confirm successful execution of command)TheLengthfield (2 bytes, in Little Endian encoding) contains the number of bytes of theDatafield.TheDatafield (as of byte 5) may use 4 reserved bytes in front of actual payload:Session Id (2 bytes, in Little Endian encoding): The session identifier assigned by the equipment in response to a session initiation commandMessage Number (2 bytes, in Little Endian encoding): A message sequence number that starts from -258 (the session initiation command) and is increased with every command sendByte5678...MeaningSessionId LsbSessionId MsbMessage Nr LsbMessage Nr MsbPayloadWhether the Session Id and Message Number is used, depends on how the connection is made (using either command 0x01 or 0x76).
The support for these commands varies per panel / firmware combination.TheChecksumis a CRC-16 checksum calculated over the full message excluding theStartandEndbyte.APIConnectconnect(password)The method is used to connect a C3 device using TCP.
RS485 is not supported,  neither is using a password to secure the connection.
This method must be called before any other method and initializes a C3 session.
The parameterpasswordis optional, when omitted, a connection attempt is made without password.
Returns true in case of a successful connection.Disconnectdisconnect()Disconnects from the C3 access panel and ends the session.Get RTLog (real-time log)get_rt_log()This method acquires the realtime event log generated by the access panel.
It contains the door and/or alarm status of the equipment.
It returns an array of DoorAlarmStatusRecord and/or EventRecord objects.Get Device Parametersget_device_param(params_arr)This method reads device parameters, both configuration and static parameters.
The argument is a list of (maximum 30) strings with the parameter names for which the values need to be returned. Valid values are (reduced list):
~SerialNumber, AntiPassback, AuxInCount, AuxOutCount, BackupTime, ComPwd, DateTime, DaylightSavingTime, DaylightSavingTimeOn, DLSTMode, Door{N}CancelKeepOpenDay, Door{N}CloseAndLock, Door{N}Detectortime, Door{N}Drivertime, Door{N}FirstCardOpenDoor, Door{N}ForcePassWord, Door{N}Intertime, Door{N}KeepOpenTimeZone, Door{N}MultiCardOpenDoor, Door{N}SensorType, Door{N}SupperPassWord, Door{N}ValidTZ, Door{N}VerifyType, GATEIPAddress, InBIOTowWay , InterLock, IPAddress, LockCount, NetMask, ReaderCount, Reboot, RS232BaudRate, StandardTime, WatchDog, WeekOfMonth{N},
For the full list and the meaning of the returned value, refer to the PullSDK specification.
The return value is a table of key/value pairs with the parameter name and value.Control Devicecontrol_device(control_command_object)Sends a control command to the access panel to perform an action on the requipment. The control_command is an instance of one of the following objects:ControlDeviceOutput(output_number, address, duration): Open or close a door or auxiliary deviceoutput_number: The number of the door or auxiliary to control (1-4)address: Determines whetherdoor_numberis a door (address= 1) or an auxiliary (address= 2)duration: The duration for which the door will be open; 0 will close the door immediately, 1-254 will leave the door open for that number of seconds: 255 will leave the door open for an undetermined periodControlDeviceCancelAlarms(): Cancel any triggered alarmControlDeviceRestart(): Reboot the access panelControlDeviceNormalOpenStateEnable(door_number, enable_disable): Change the normal open/close state for the door controllerdoor_number: The number of the door to control (1-4)enable: Enable normally open mode (enable= True) or disable normally open mode for the door (enable_disable= 0, default)Set log levellog_level(level)Sets the logging level, using the Python logging levels.