Metadata-Version: 2.4
Name: uns-kit
Version: 0.0.2
Summary: Lightweight Python UNS MQTT client (pub/sub + infra topics)
License: MIT
Author: Aljoša Vister
Author-email: aljosa.vister@gmail.com
Requires-Python: >=3.10,<4.0
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Requires-Dist: asyncio-mqtt (>=0.16.1,<0.17.0)
Requires-Dist: click (>=8.1.7,<9.0.0)
Description-Content-Type: text/markdown

# uns-kit (Python)

Lightweight UNS MQTT client for Python. Provides:
- Topic builder compatible with UNS infra topics (`uns-infra/<package>/<version>/<process>/`).
- Async publish/subscribe via MQTT v5 (using `asyncio-mqtt`).
- Infra status topics (`alive`, `uptime`) with MQTT will.
- Minimal UNS packet builder/parser (data/table).

## Install (editable)
```bash
cd packages/uns-py
poetry install
```

## CLI
After `poetry install`, a `uns-kit` command is available:
```bash
poetry run uns-kit publish --host localhost:1883 --topic raw/data/ --value 1
poetry run uns-kit subscribe --host localhost:1883 --topic 'uns-infra/#'
poetry run uns-kit write-config --path config.json
```

## Quick start
```python
import asyncio
from uns_kit import UnsMqttClient, TopicBuilder, UnsPacket

async def main():
    tb = TopicBuilder(package_name="uns-kit", package_version="0.0.1", process_name="py-demo")
    client = UnsMqttClient(host="mqtt-broker", topic_builder=tb, reconnect_interval=1)
    await client.connect()

    # Subscribe
    async with client.messages("uns-infra/#") as messages:
        await client.publish_packet("raw/data/", UnsPacket.data(value=1, uom="count"))
        msg = await messages.__anext__()
        print(msg.topic, msg.payload.decode())

    await client.close()

asyncio.run(main())
```

### Resilient subscriber
```python
async for msg in client.resilient_messages("uns-infra/#"):
    print(msg.topic, msg.payload.decode())
```

### Examples
- `examples/publish.py` — publish 5 data packets.
- `examples/subscribe.py` — resilient subscription with auto-reconnect.

## Notes
- Default QoS is 0; will message is retained on `<statusTopic>alive`.
- Uptime is published every 10 seconds on `<statusTopic>uptime`.
- Packet shape mirrors the TypeScript core: `{"version":1,"message":{"data":{...}},"sequenceId":0}`.

