TOKEN = "< YOUR_ACCESS_TOKEN >"
URL   = "https://.edge.zerokey.com/hubs/eventHub"
 
rclpy.init()
node = Node("zk_rtls")
pub  = node.create_publisher(PointStamped, "/zerokey/position", 10)
 
hub = HubConnectionBuilder().with_url(URL, options={"access_token_factory": lambda: TOKEN}).build()
hub.on("positionUpdates", lambda e: pub.publish(
    PointStamped(header=node.get_clock().now().to_msg(),
                 point=type("P", (), dict(x=e["position"][0], y=e["position"][1], z=e["position"][2]))())))
hub.start(); rclpy.spin(node)
{ 
  "Timestamp": "2025-10-08T15:42:11Z", 
  "WorkflowID": "WF-TRK-042", 
  "StepType": "BoltSequencing", 
  "OperatorID": "E0:05:6E:B9:C1:0A", 
  "Status": "Completed", 
  "Bolts": [ 
    { "ID": 1, "TorqueNm": 320.4, "Status": "OK" }, 
    { "ID": 2, "TorqueNm": 322.1, "Status": "OK" }, 
    { "ID": 3, "TorqueNm": 319.7, "Status": "OK" }, 
    { "ID": 4, "TorqueNm": 318.9, "Status": "OK" } 
  ], 
  "Summary": { 
    "CompletedBolts": 4, 
    "Missed": 0, 
    "OutOfOrder": 0, 
    "AvgTorqueNm": 320.7 
  } 
}
import paho.mqtt.client as mqtt
import json

BROKER = "yourdomain.edge.zerokey.com"
TOPIC = "zerokey/tools/torqueEvents"
TOKEN = ""

def on_message(client, userdata, msg):
    data = json.loads(msg.payload)
    print(f"{data['Timestamp']} | {data['ToolID']} | {data['TorqueNm']} Nm | {data['Status']}")

client = mqtt.Client()
client.username_pw_set(username="token", password=TOKEN)
client.connect(BROKER, 1883, 60)
client.subscribe(TOPIC)
client.on_message = on_message
client.loop_forever()