diff --git a/README.md b/README.md index 9ef8060..4dd3f5a 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ This is a Docker-based MQTT client that listens for print requests, generates ve - `MQTT_HOST`: MQTT broker hostname - `MQTT_PORT`: MQTT broker port - `MQTT_TOPIC_SUB`: Topic to subscribe for print requests - - `MQTT_TOPIC_PUB_ERRORS`: Topic to publish errors + - `MQTT_TOPIC_PUB_STATUS`: Topic to publish status messages (success and errors) - `PRINTER_DEVICE`: Printer device path (e.g., /dev/usb/lp0) - `PRINTER_MODEL`: Printer model (e.g., QL-800) - `LABEL_SIZE_DEFAULT`: Default label size (e.g., 29x90) diff --git a/client.py b/client.py index 3bfe8ad..6e39098 100644 --- a/client.py +++ b/client.py @@ -14,7 +14,7 @@ from templates import TEMPLATES MQTT_HOST = os.getenv('MQTT_HOST', 'localhost') MQTT_PORT = int(os.getenv('MQTT_PORT', 1883)) MQTT_TOPIC_SUB = os.getenv('MQTT_TOPIC_SUB', 'vet/labels/print') -MQTT_TOPIC_PUB_ERRORS = os.getenv('MQTT_TOPIC_PUB_ERRORS', 'vet/labels/errors') +MQTT_TOPIC_PUB_STATUS = os.getenv('MQTT_TOPIC_PUB_STATUS', 'vet/labels/status') MQTT_TOPIC_HEARTBEAT = os.getenv('MQTT_TOPIC_HEARTBEAT', 'vet/labels/heartbeat') PRINTER_DEVICE = os.getenv('PRINTER_DEVICE', '/dev/usb/lp0') PRINTER_MODEL = os.getenv('PRINTER_MODEL', 'QL-800') @@ -60,10 +60,12 @@ def on_message(client, userdata, msg): return print(f"Raw message received on topic '{msg.topic}': {raw_payload}") + job_id = None try: payload = json.loads(raw_payload) print(f"Parsed payload: {payload}") + job_id = payload.get('job_id') template_id = payload.get('template_id', 'vet_label') label_size = payload.get('label_size', LABEL_SIZE_DEFAULT) variables = payload.get('variables', {}) @@ -85,6 +87,17 @@ def on_message(client, userdata, msg): if test: print(f"Test mode: PNG saved as {filename}") + # Publish success status for test mode + success_details = { + "status": "success", + "job_id": job_id, + "template_id": template_id, + "label_size": label_size, + "test_mode": True, + "filename": filename, + "timestamp": time.time() + } + client.publish(MQTT_TOPIC_PUB_STATUS, json.dumps(success_details)) else: print("Printing label...") status = print_label(image, label=label_size) @@ -99,6 +112,8 @@ def on_message(client, userdata, msg): errors = printer_state.get('errors', []) error_details = { + "status": "error", + "job_id": job_id, "error": f"Print failed: {status_type}", "status_type": status_type, "media_type": media_type, @@ -110,17 +125,28 @@ def on_message(client, userdata, msg): error_msg = f"Print failed: {status_type}. Media: {media_type} ({media_width}mm)" print(error_msg) - client.publish(MQTT_TOPIC_PUB_ERRORS, json.dumps(error_details)) + client.publish(MQTT_TOPIC_PUB_STATUS, json.dumps(error_details)) raise Exception(error_msg) + else: + # Print successful - publish success status + success_details = { + "status": "success", + "job_id": job_id, + "template_id": template_id, + "label_size": label_size, + "timestamp": time.time() + } + print(f"Print successful: {template_id}") + client.publish(MQTT_TOPIC_PUB_STATUS, json.dumps(success_details)) except json.JSONDecodeError as e: error_msg = f"Invalid JSON in message: {e}. Raw payload: {raw_payload}" print(error_msg) - client.publish(MQTT_TOPIC_PUB_ERRORS, json.dumps({"error": error_msg, "topic": msg.topic})) + client.publish(MQTT_TOPIC_PUB_STATUS, json.dumps({"status": "error", "job_id": job_id, "error": error_msg, "topic": msg.topic})) except Exception as e: error_msg = f"Error processing message: {str(e)}" print(error_msg) - client.publish(MQTT_TOPIC_PUB_ERRORS, json.dumps({"error": error_msg, "original_payload": raw_payload})) + client.publish(MQTT_TOPIC_PUB_STATUS, json.dumps({"status": "error", "job_id": job_id, "error": error_msg, "original_payload": raw_payload})) def heartbeat(client): while True: