Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ctypes.ArgumentError at set_device_data #6

Open
DrGhonzo opened this issue Jun 2, 2022 · 2 comments
Open

ctypes.ArgumentError at set_device_data #6

DrGhonzo opened this issue Jun 2, 2022 · 2 comments

Comments

@DrGhonzo
Copy link

DrGhonzo commented Jun 2, 2022

Hi there, hope you're well and safe.
Working with a C3-400 I'm getting the following traceback:

Traceback (most recent call last):
  File "C:\Users\Dr.Ghonzo\AppData\Local\Programs\Python\Python37\lib\site-packages\pyzkaccess\device_data\model.py", line 262, in save
    gen.send(None)
  File "C:\Users\Dr.Ghonzo\AppData\Local\Programs\Python\Python37\lib\site-packages\pyzkaccess\sdk.py", line 361, in set_device_data
    err = self.dll.SetDeviceData(self.handle, query_table, query_records, "")
ctypes.ArgumentError: argument 4: <class 'TypeError'>: wrong type

How can we follow?
Thank you for your time.
KR

@bdragon300
Copy link
Owner

Hello @DrGhonzo . Could you please provide a code snippet which causes this exception? Or you're using cli? And which table you're trying to save. Thanks

@DrGhonzo
Copy link
Author

DrGhonzo commented Jun 9, 2022

Hi Igor,
I'm glad to have news from you. Hope everytyhing is going well there.
Below is the full code I'm working at right now.
Some tips I was thinking about were that I'm using x64 python 3.7 version.

from concurrent.futures import ThreadPoolExecutor
from datetime import date
from pyzkaccess import ZKAccess, ZKSDKError
from pyzkaccess.tables import User
import logging
import paho.mqtt.client as mqtt
import queue
import threading
import time


# Create a custom logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# Create handlers
stream_handler = logging.StreamHandler()
file_handler = logging.FileHandler(str(date.today()) + '_file.log')
stream_handler.setLevel(logging.DEBUG)
file_handler.setLevel(logging.WARNING)

# Create formatters and add it to handlers
stream_format = logging.Formatter('%(levelname)s - %(asctime)s - %(name)s - %(message)s')
file_format = logging.Formatter('%(levelname)s - %(asctime)s - %(name)s - %(message)s')
stream_handler.setFormatter(stream_format)
file_handler.setFormatter(file_format)

#  Add handlers to the logger
logger.addHandler(stream_handler)
logger.addHandler(file_handler)


def update_user(c, u):
    '''
        :param c: controller
        :param u: user
    '''
    u = User(card=str(u))
    for controller in c:
        controller.table(User).upsert(u)
    logger.info("updated")


def create_user(c, u):
    '''
        :param c: controllers
        :param u: user
    '''
    logger.debug(u)
    for controller in c:
        u = User(card=str(u)).with_zk(controller)
        u.save()
        logger.info("user %s created at controller %d", u, c.index(controller))


def check_events(c, q, e):
    '''
        :param c controller
        :param q queue
        :param e event
    '''

    while not e.is_set():
        # print("no events")
        logger.debug("no events")
        for door1_event in c.events.poll(timeout=1):
            # print("an event ", door1_event)
            if door1_event.card and door1_event.card != '0':
                # print('Got card #', door1_event.card)
                q.put(door1_event)
                card = door1_event.card


def handle_events(c, q, e):
    while not e.is_set():
        if not q.empty():
            msg = q.get()
            c.publish("test", str(msg))
            # print("a message ", msg)


def wait4devices():

    try:
        # looking for devices on the network
        logger.debug("looking for devices on the network")
        found = ZKAccess.search_devices('192.168.1.255')
        if found:
            # log devices info
            logger.debug("found %d devices", len(found))
            l = []
            for device in found:
                zk = ZKAccess(device=device)
                l.append(zk)
                logger.debug("devices instance " + zk.parameters.ip_address)
                # print("devices instance " + zk.parameters.ip_address)
                # print(type(zk))
            '''do something with the found list'''
            return l

    except ZKSDKError as e:
        logger.exception(e)
        return False
        # # print(str(e))


def wait4mqtt():
    # Instantiate MQTT client
    c = mqtt.Client("api")
    logger.debug("mqtt client connect")
    try:
        c.on_connect = on_connect
        c.on_message = on_message
        c.connect('localhost', 1883, 60)
        c.loop_start()
        return c

    except ConnectionRefusedError as e:
        logger.exception(e)


def on_connect(client, userdata, flags, rc):
    if rc == 0:
        logger.debug("attempting to subscribe to 'test'")
        client.subscribe("test")


def on_message(client, userdata, msg):
    logger.debug(msg.topic)
    logger.debug(msg.payload)


def main():
    events_queue = queue.Queue()

    event = threading.Event()

    zk = wait4devices()

    client = wait4mqtt()

    client.publish("test", "starting")

    command = input("input your command: ")

    if command == 'r':

        with ThreadPoolExecutor(max_workers=len(zk) + 1) as executor:
            for device in zk:
                executor.submit(check_events, device, events_queue, event)
            executor.submit(handle_events, client, events_queue, event)

            time.sleep(20)
            # print("exiting")
            client.publish("test", "exiting")
            event.set()
    elif command == 'c':
        card = input("input card #: ")
        create_user(zk, card)
        # update_user(zk, card)
        # print(card)


if __name__ == '__main__':

    main()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants