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

Release files for smartx-rfid 12.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for smartx-rfid 12.0.3
File Size Uploaded
smartx_rfid-12.0.3.tar.gz 99.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for smartx-rfid 12.0.3
File Interpreter ABI Platform
smartx_rfid-12.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 226.6 kB

Release files / smartx_rfid-12.0.3.tar.gz

Download URL smartx_rfid-12.0.3.tar.gz
Size 99.5 kB
Tags Source
SHA-256 checksum
How to use checksums
36039f39be8ea3a2cc7bd5e9ba89d175f63a1e9eb2f45060ba8bf3e0d582e77b
BLAKE2b-256 checksum
How to use checksums
e6e64313146136001143be43f21e2b52999ccb12770e92d2e2445ca8cdbba61e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.16

Release files / smartx_rfid-12.0.3-py3-none-any.whl

Download URL smartx_rfid-12.0.3-py3-none-any.whl
Size 127.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fcdd9c43cfc4f4ff4bc69962658796dfe7e85f213c5d7b9ea150e1f6ec54ff94
BLAKE2b-256 checksum
How to use checksums
407362710019f5dac0767cc957fc8adebac45ea7dc837df41ec24ff1e22a70e0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.16

Release history Release notifications | RSS feed

12.4.4

2 release files

12.4.3

2 release files

12.4.2

2 release files

12.4.1

2 release files

12.4.0

2 release files

12.3.4

2 release files

12.3.3

2 release files

12.3.2

2 release files

12.3.1

2 release files

12.3.0

2 release files

12.2.0

2 release files

This release

12.0.3 This release

2 release files

11.9.8

2 release files

11.9.7

2 release files

11.9.6

2 release files

11.9.5

2 release files

11.9.4

2 release files

11.9.3

2 release files

11.9.2

2 release files

11.9.1

2 release files

11.9.0

2 release files

11.8.9

2 release files

11.8.8

2 release files

11.8.7

2 release files

11.8.6

2 release files

11.8.5

2 release files

11.8.4

2 release files

11.8.3

2 release files

11.8.2

2 release files

11.8.1

2 release files

11.8.0

2 release files

11.7.4

2 release files

11.7.3

2 release files

11.6.2

2 release files

11.6.1

2 release files

11.6.0

2 release files

11.5.0

2 release files

11.4.3

2 release files

11.4.2

2 release files

11.4.1

2 release files

11.4.0

2 release files

11.3.1

2 release files

11.3.0

2 release files

11.2.2

2 release files

11.2.1

2 release files

11.2.0

2 release files

11.1.2

2 release files

11.1.1

2 release files

11.1.0

2 release files

11.0.9

2 release files

11.0.8

2 release files

11.0.7

2 release files

11.0.6

2 release files

11.0.5

2 release files

11.0.4

2 release files

11.0.3

2 release files

11.0.2

2 release files

11.0.1

2 release files

11.0.0

2 release files

10.1.9

2 release files

10.1.8

2 release files

10.1.7

2 release files

10.1.6

2 release files

10.1.5

2 release files

10.1.4

2 release files

10.1.3

2 release files

10.1.2

2 release files

10.1.1

2 release files

10.1.0

2 release files

9.1.0

2 release files

9.0.6

2 release files

9.0.5

2 release files

9.0.4

2 release files

9.0.3

2 release files

9.0.2

2 release files

9.0.1

2 release files

9.0.0

2 release files

8.1.4

2 release files

8.1.3

2 release files

8.1.2

2 release files

8.1.1

2 release files

8.1.0

2 release files

8.0.5

2 release files

8.0.4

2 release files

8.0.3

2 release files

8.0.2

2 release files

8.0.1

2 release files

8.0.0

2 release files

7.6.0

2 release files

7.5.0

2 release files

7.4.0

2 release files

7.3.9

2 release files

7.3.8

2 release files

7.3.7

2 release files

7.3.3

2 release files

7.3.2

2 release files

7.3.1

2 release files

7.3.0

2 release files

7.2.7

2 release files

7.2.6

2 release files

7.2.5

2 release files

7.2.4

2 release files

7.2.3

2 release files

7.2.1

2 release files

7.2.0

2 release files

7.1.4

2 release files

7.1.3

2 release files

7.1.2

2 release files

7.1.1

2 release files

7.1.0

2 release files

7.0.5

2 release files

7.0.4

2 release files

7.0.3

2 release files

7.0.2

2 release files

6.2.3

2 release files

6.2.2

2 release files

6.2.1

2 release files

6.2.0

2 release files

6.1.1

2 release files

6.1.0

2 release files

6.0.9

2 release files

6.0.8

2 release files

6.0.7

2 release files

6.0.6

2 release files

6.0.5

2 release files

6.0.4

2 release files

6.0.3

2 release files

6.0.2

2 release files

6.0.1

2 release files

6.0.0

2 release files

5.7.2

2 release files

5.7.1

2 release files

5.7.0

2 release files

5.6.8

2 release files

5.6.7

2 release files

5.6.6

2 release files

5.6.5

2 release files

5.6.4

2 release files

5.6.3

2 release files

5.6.2

2 release files

5.6.1

2 release files

5.6.0

2 release files

5.5.0

2 release files

5.4.1

2 release files

5.4.0

2 release files

5.3.15

2 release files

5.3.14

2 release files

5.3.13

2 release files

5.3.12

2 release files

5.3.11

2 release files

5.3.10

2 release files

5.3.9

2 release files

5.3.8

2 release files

5.3.7

2 release files

5.3.6

2 release files

5.3.5

2 release files

5.3.4

2 release files

5.3.3

2 release files

5.3.2

2 release files

5.3.1

2 release files

5.3.0

2 release files

5.2.0

2 release files

5.1.1

2 release files

5.1.0

2 release files

5.0.1

2 release files

5.0.0

2 release files

4.7.2

2 release files

4.7.1

2 release files

4.7.0

2 release files

4.6.0

2 release files

4.5.3

2 release files

4.5.2

2 release files

4.5.1

2 release files

4.5.0

2 release files

4.4.1

2 release files

4.4.0

2 release files

4.3.3

2 release files

4.3.2

2 release files

4.3.1

2 release files

4.3.0

2 release files

4.2.9

2 release files

4.2.8

2 release files

4.2.7

2 release files

4.2.6

2 release files

4.2.5

2 release files

4.2.2

2 release files

4.2.1

2 release files

4.2.0

2 release files

4.1.2

2 release files

4.1.0

2 release files

4.0.1

2 release files

4.0.0

2 release files

3.2.1

2 release files

3.2.0

2 release files

3.1.3

2 release files

3.1.2

2 release files

3.1.1

2 release files

3.1.0

2 release files

3.0.0

2 release files

2.3.1

2 release files

2.3.0

2 release files

2.2.2

2 release files

2.2.1

2 release files

2.1.0

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.9.3

2 release files

1.9.2

2 release files

1.9.1

2 release files

1.9.0

2 release files

1.8.4

2 release files

1.8.3

2 release files

1.8.2

2 release files

1.8.1

2 release files

1.8.0

2 release files

1.7.4

2 release files

1.7.3

2 release files

1.7.2

2 release files

1.7.1

2 release files

1.7.0

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.4

2 release files

1.5.3

2 release files

1.5.2

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.6

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.5.5

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.2

2 release files

0.2.0

2 release files

0.1.4

2 release 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