Skip to main content

SmartX RFID

Python Version Version License

Python library for SmartX RFID integrations: device communication, webhook delivery, database utilities, parsing, and support modules for production flows.

Installation

pip install smartx-rfid

For development:

poetry install

Main Modules

  • smartx_rfid.devices
    • RFID: X714, R700_IOT, ACUPAD
    • Generic: SERIAL, TCP
    • Printers: SatoPrinter, SatoWs4Printer
    • DeviceManager
  • smartx_rfid.webhook
    • WebhookManager
    • WebhookXtrack
  • smartx_rfid.db
    • DatabaseManager
  • smartx_rfid.auth
    • token and password helpers
  • smartx_rfid.api
    • Omie and Xtrack API clients
  • smartx_rfid.utils
    • TagList, AlertsManager, delayed_function, hash, regex helpers

Quick Start (Device Events)

import asyncio
from smartx_rfid.devices import X714


async def handle_tag(device_name: str, event_data: dict):
    print(f"[{device_name}] EPC={event_data.get('epc')} RSSI={event_data.get('rssi')}")


async def main():
    reader = X714(name="X714-Reader", start_reading=True)

    def on_event(device_name: str, event_type: str, event_data: dict):
        if event_type == "tag":
            asyncio.create_task(handle_tag(device_name, event_data))

    reader.on_event = on_event
    await reader.connect()

    while True:
        await asyncio.sleep(1)


asyncio.run(main())

Webhook Manager

The webhook API now has two explicit sending methods:

  • post_event: standardized event envelope
  • post: custom payload POST

It is designed for burst traffic and includes:

  • async client reuse (keep-alive)
  • request concurrency limiter
  • retry with exponential backoff for network errors, HTTP 429, and HTTP 5xx
  • safe payload serialization for datetime/date, Decimal, bytes, custom objects, dict/list/tuple/set

Constructor

from smartx_rfid.webhook import WebhookManager

webhook = WebhookManager(
    url="https://api.example.com/webhook",  # base URL
    timeout=5.0,
    max_retries=2,
    max_concurrent_requests=50,
)

post_event (standard payload)

success = await webhook.post_event(
    device="reader-01",
    event_type="tag_read",
    event_data={"epc": "E200001175000001", "rssi": -45.2},
)

Payload format sent by post_event:

{
  "device": "reader-01",
  "event_type": "tag_read",
  "event_data": {
    "epc": "E200001175000001",
    "rssi": -45.2
  }
}

post (custom payload + optional URL override)

from datetime import datetime
from decimal import Decimal

payload = {
    "type": "heartbeat",
    "status": "ok",
    "timestamp": datetime.utcnow(),
    "load": Decimal("0.73"),
}

success = await webhook.post(
    payload=payload,
    headers={"X-Source": "rfid-core"},
    url="https://api.example.com/custom-endpoint",  # optional
)

If url is not provided, WebhookManager uses the base URL configured in the constructor.

High-Throughput Example

import asyncio

webhook = WebhookManager(
    url="https://api.example.com/events",
    max_concurrent_requests=20,
    max_retries=2,
)

events = [{"index": i, "ok": True} for i in range(200)]
results = await asyncio.gather(*(webhook.post(payload=e) for e in events))

print(f"sent={sum(results)} failed={len(results) - sum(results)}")
await webhook.aclose()

Recommended pattern:

async with WebhookManager(url="https://api.example.com/events") as webhook:
    await webhook.post_event("reader-01", "connected", {"status": "ok"})

Migration Note

Previous usage:

await webhook.post("device", "event_type", {"data": 1})

Current usage:

await webhook.post_event("device", "event_type", {"data": 1})

For arbitrary payloads, use:

await webhook.post(payload={"anything": "you need"})

Database Example

from datetime import datetime
from sqlalchemy import Column, DateTime, Float, Integer, String
from sqlalchemy.orm import DeclarativeBase
from smartx_rfid.db import DatabaseManager


class Base(DeclarativeBase):
    pass


class TagModel(Base):
    __tablename__ = "rfid_tags"

    id = Column(Integer, primary_key=True)
    epc = Column(String(64), unique=True, nullable=False)
    rssi = Column(Float)
    created_at = Column(DateTime, default=datetime.utcnow)


db = DatabaseManager("sqlite:///rfid_tags.db")
db.register_models(TagModel)
db.create_tables()

with db.get_session() as session:
    session.add(TagModel(epc="E200001175000001", rssi=-45.2))

Event Callback Contract

All devices share a consistent callback contract:

def on_event(device_name: str, event_type: str, event_data: dict):
    # Common event_type values:
    # connected, disconnected, tag, error
    ...

Examples Directory

The examples folder includes:

  • examples/devices/RFID
  • examples/devices/generic
  • examples/devices/printer
  • examples/db
  • examples/api
  • examples/email
  • examples/license
  • examples/smtx_db
  • examples/utils

Run examples with:

python examples/devices/RFID/X714_SERIAL.py
python examples/db/showcase.py

Running Tests

pytest

To run only webhook-related tests:

pytest tests/utils/test_serialization.py -k webhook

Requirements

  • Python 3.11+
  • Works on Linux, macOS, and Windows (depending on device transport and drivers)

License

MIT

Support

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

smartx_rfid-11.8.9.tar.gz (93.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

smartx_rfid-11.8.9-py3-none-any.whl (119.4 kB view details)

Uploaded Python 3

File details

Details for the file smartx_rfid-11.8.9.tar.gz.

File metadata

  • Download URL: smartx_rfid-11.8.9.tar.gz
  • Upload date:
  • Size: 93.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.11.15

File hashes

Hashes for smartx_rfid-11.8.9.tar.gz
Algorithm Hash digest
SHA256 9722c3c99bbc98b98677d6a1897cf1b80455b30da07548c2e1688d0f0a1cc3e4
MD5 f0c4f0cdb6d23b00aa70d62dadd9b8e7
BLAKE2b-256 c58d319fc15961cd748512be468a936b26e1d314411d5ec4c9ed4642a78632f6

See more details on using hashes here.

File details

Details for the file smartx_rfid-11.8.9-py3-none-any.whl.

File metadata

  • Download URL: smartx_rfid-11.8.9-py3-none-any.whl
  • Upload date:
  • Size: 119.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.11.15

File hashes

Hashes for smartx_rfid-11.8.9-py3-none-any.whl
Algorithm Hash digest
SHA256 c42018d1645911613518a53ebdf98f5f2c57ee3b6f2fdbe39d34f3940d3ce2ad
MD5 ba4fae1b292d663218f0f4842683c20c
BLAKE2b-256 8bdf070131946407afb9036afe688ac38337d97f16a3f859690d112167fd9ddb

See more details on using hashes here.

Release history Release notifications | RSS feed

12.0.1

2 files

12.0.0

2 files

11.10.0

2 files

11.9.8

2 files

11.9.7

2 files

11.9.6

2 files

11.9.5

2 files

11.9.4

2 files

11.9.3

2 files

11.9.2

2 files

11.9.1

2 files

11.9.0

2 files

11.8.18

2 files

11.8.17

2 files

11.8.16

2 files

11.8.15

2 files

11.8.14

2 files

11.8.13

2 files

11.8.12

2 files

11.8.11

2 files

11.8.10

2 files

This release

11.8.9 This release

2 files

11.8.8

2 files

11.8.7

2 files

11.8.6

2 files

11.8.5

2 files

11.8.4

2 files

11.8.3

2 files

11.8.2

2 files

11.8.1

2 files

11.8.0

2 files

11.7.4

2 files

11.7.3

2 files

11.7.2

2 files

11.7.1

2 files

11.7.0

2 files

11.6.6

2 files

11.6.5

2 files

11.6.4

2 files

11.6.3

2 files

11.6.2

2 files

11.6.1

2 files

11.6.0

2 files

11.5.0

2 files

11.4.3

2 files

11.4.2

2 files

11.4.1

2 files

11.4.0

2 files

11.3.1

2 files

11.3.0

2 files

11.2.2

2 files

11.2.1

2 files

11.2.0

2 files

11.1.2

2 files

11.1.1

2 files

11.1.0

2 files

11.0.12

2 files

11.0.11

2 files

11.0.10

2 files

11.0.9

2 files

11.0.8

2 files

11.0.7

2 files

11.0.6

2 files

11.0.5

2 files

11.0.4

2 files

11.0.3

2 files

11.0.2

2 files

11.0.1

2 files

11.0.0

2 files

10.1.11

2 files

10.1.10

2 files

10.1.9

2 files

10.1.8

2 files

10.1.7

2 files

10.1.6

2 files

10.1.5

2 files

10.1.4

2 files

10.1.3

2 files

10.1.2

2 files

10.1.1

2 files

10.1.0

2 files

10.0.1

2 files

10.0.0

2 files

9.1.0

2 files

9.0.6

2 files

9.0.5

2 files

9.0.4

2 files

9.0.3

2 files

9.0.2

2 files

9.0.1

2 files

9.0.0

2 files

8.1.4

2 files

8.1.3

2 files

8.1.2

2 files

8.1.1

2 files

8.1.0

2 files

8.0.5

2 files

8.0.4

2 files

8.0.3

2 files

8.0.2

2 files

8.0.1

2 files

8.0.0

2 files

7.6.0

2 files

7.5.0

2 files

7.4.0

2 files

7.3.9

2 files

7.3.8

2 files

7.3.7

2 files

7.3.3

2 files

7.3.2

2 files

7.3.1

2 files

7.3.0

2 files

7.2.7

2 files

7.2.6

2 files

7.2.5

2 files

7.2.4

2 files

7.2.3

2 files

7.2.1

2 files

7.2.0

2 files

7.1.4

2 files

7.1.3

2 files

7.1.2

2 files

7.1.1

2 files

7.1.0

2 files

7.0.5

2 files

7.0.4

2 files

7.0.3

2 files

7.0.2

2 files

6.2.3

2 files

6.2.2

2 files

6.2.1

2 files

6.2.0

2 files

6.1.1

2 files

6.1.0

2 files

6.0.9

2 files

6.0.8

2 files

6.0.7

2 files

6.0.6

2 files

6.0.5

2 files

6.0.4

2 files

6.0.3

2 files

6.0.2

2 files

6.0.1

2 files

6.0.0

2 files

5.7.2

2 files

5.7.1

2 files

5.7.0

2 files

5.6.8

2 files

5.6.7

2 files

5.6.6

2 files

5.6.5

2 files

5.6.4

2 files

5.6.3

2 files

5.6.2

2 files

5.6.1

2 files

5.6.0

2 files

5.5.0

2 files

5.4.1

2 files

5.4.0

2 files

5.3.15

2 files

5.3.14

2 files

5.3.13

2 files

5.3.12

2 files

5.3.11

2 files

5.3.10

2 files

5.3.9

2 files

5.3.8

2 files

5.3.7

2 files

5.3.6

2 files

5.3.5

2 files

5.3.4

2 files

5.3.3

2 files

5.3.2

2 files

5.3.1

2 files

5.3.0

2 files

5.2.0

2 files

5.1.1

2 files

5.1.0

2 files

5.0.1

2 files

5.0.0

2 files

4.7.2

2 files

4.7.1

2 files

4.7.0

2 files

4.6.0

2 files

4.5.3

2 files

4.5.2

2 files

4.5.1

2 files

4.5.0

2 files

4.4.1

2 files

4.4.0

2 files

4.3.3

2 files

4.3.2

2 files

4.3.1

2 files

4.3.0

2 files

4.2.9

2 files

4.2.8

2 files

4.2.7

2 files

4.2.6

2 files

4.2.5

2 files

4.2.2

2 files

4.2.1

2 files

4.2.0

2 files

4.1.2

2 files

4.1.0

2 files

4.0.1

2 files

4.0.0

2 files

3.2.1

2 files

3.2.0

2 files

3.1.3

2 files

3.1.2

2 files

3.1.1

2 files

3.1.0

2 files

3.0.0

2 files

2.3.1

2 files

2.3.0

2 files

2.2.2

2 files

2.2.1

2 files

2.1.0

2 files

2.0.1

2 files

2.0.0

2 files

1.9.3

2 files

1.9.2

2 files

1.9.1

2 files

1.9.0

2 files

1.8.4

2 files

1.8.3

2 files

1.8.2

2 files

1.8.1

2 files

1.8.0

2 files

1.7.4

2 files

1.7.3

2 files

1.7.2

2 files

1.7.1

2 files

1.7.0

2 files

1.6.1

2 files

1.6.0

2 files

1.5.4

2 files

1.5.3

2 files

1.5.2

2 files

1.5.1

2 files

1.5.0

2 files

1.4.2

2 files

1.4.1

2 files

1.3.0

2 files

1.2.0

2 files

1.1.6

2 files

1.1.5

2 files

1.1.4

2 files

1.1.3

2 files

1.1.2

2 files

1.1.1

2 files

1.1.0

2 files

1.0.0

2 files

0.5.5

2 files

0.5.3

2 files

0.5.2

2 files

0.5.1

2 files

0.5.0

2 files

0.4.1

2 files

0.4.0

2 files

0.3.2

2 files

0.2.0

2 files

0.1.4

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page