From 6bf5debce89c777b26b01c0191847ac0c0ac872a Mon Sep 17 00:00:00 2001 From: coon Date: Thu, 25 Sep 2025 22:00:40 +0200 Subject: [PATCH 1/3] add comment with link to A&H midi spec --- mixer.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mixer.py b/mixer.py index 7ed3639..a5d7448 100755 --- a/mixer.py +++ b/mixer.py @@ -6,6 +6,9 @@ import mido from enum import Enum +# For Allen & Heath Qu MIDI protocol documentation see: +# https://www.allen-heath.com/content/uploads/2023/06/Qu_MIDI_Protocol_V1.9.pdf + class Mixer: def __init__(self, ip): From a2f4079223aaf964720d44db79b3719b9036c6da Mon Sep 17 00:00:00 2001 From: coon Date: Thu, 25 Sep 2025 22:27:48 +0200 Subject: [PATCH 2/3] mqtt_client.py: subscribe to actual topic + require mqtt broker hostname via arg --- mqtt_client.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mqtt_client.py b/mqtt_client.py index 3ff7ed6..3b7e5b8 100644 --- a/mqtt_client.py +++ b/mqtt_client.py @@ -7,7 +7,6 @@ import paho.mqtt.client as mqtt import mixer from mixer import Mixer -MQTT_SERVER_ADDRESS = "localhost" MQTT_SERVER_PORT = 1883 MQTT_TOPIC = "homeassistant/device/mixer" @@ -16,7 +15,7 @@ m: Mixer = None def on_connect(client, userdata, flags, reason_code, properties): print(f"Connected: {reason_code}") - client.subscribe("#") + client.subscribe(MQTT_TOPIC) def on_message(client, userdata, msg): @@ -35,18 +34,20 @@ def on_message(client, userdata, msg): def main(): parser = argparse.ArgumentParser(description="Allen & Heath Qu MQTT Remote Control") - parser.add_argument("ip", help="IP of the mixer") + parser.add_argument("mixer_ip", help="IP of the mixer") + parser.add_argument("mqtt_hostname", help="IP of the MQTT broker") args = parser.parse_args() - print(f"IP: {args.ip}") + + print(f"Mixer IP: {args.mixer_ip}, MQTT broker hostname: {args.mqtt_hostname}") global m - m = mixer.Mixer(args.ip, mixer.MIXER_PORT) + m = mixer.Mixer(args.mixer_ip) client = mqtt.Client(callback_api_version=mqtt.CallbackAPIVersion.VERSION2) client.on_connect = on_connect client.on_message = on_message - client.connect(MQTT_SERVER_ADDRESS, MQTT_SERVER_PORT, 60) + client.connect(args.mqtt_hostname, MQTT_SERVER_PORT, 60) client.loop_forever() From f31a6b8817cb29a0c6788e29aba0838215030f2f Mon Sep 17 00:00:00 2001 From: coon Date: Thu, 25 Sep 2025 22:29:20 +0200 Subject: [PATCH 3/3] hass_button_emulator.py: restructure + remove on_message handler + require hostname as arg --- hass_button_emulator.py | 52 +++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/hass_button_emulator.py b/hass_button_emulator.py index 9ec98c2..ef85604 100755 --- a/hass_button_emulator.py +++ b/hass_button_emulator.py @@ -2,33 +2,39 @@ import time import paho.mqtt.client as mqtt +import argparse import json import mqtt_client -def on_connect(client, userdata, flags, reason_code, properties): - print(f"Connected: {reason_code}") - client.subscribe("#") +def main(): + parser = argparse.ArgumentParser(description="Allen & Heath Qu MQTT event emulator") + parser.add_argument("mqtt_hostname", help="IP of the MQTT broker") + args = parser.parse_args() + + print(f"MQTT broker hostname: {args.mqtt_hostname}") + + def on_connect(client, userdata, flags, reason_code, properties): + print(f"Connected: {reason_code}") + client.subscribe("#") + + client = mqtt.Client(callback_api_version=mqtt.CallbackAPIVersion.VERSION2) + client.on_connect = on_connect + + client.connect(args.mqtt_hostname, mqtt_client.MQTT_SERVER_PORT, 60) + client.loop_start() + + j = json.dumps({"command": "scene_recall", "args": {"scene_id": 0}}) + # j = json.dumps({'command': 'shutdown'}) + + client.publish(mqtt_client.MQTT_TOPIC, payload=j, qos=0, retain=False) + + time.sleep(2) + + client.loop_stop() + client.disconnect() -def on_message(client, userdata, msg): - print(f"{msg.topic}: {msg.payload.decode()}") - - -client = mqtt.Client(callback_api_version=mqtt.CallbackAPIVersion.VERSION2) -client.on_connect = on_connect -client.on_message = on_message - -client.connect(mqtt_client.MQTT_SERVER_ADDRESS, mqtt_client.MQTT_SERVER_PORT, 60) -client.loop_start() - -j = json.dumps({"command": "scene_recall", "args": {"scene_id": 0}}) -# j = json.dumps({'command': 'shutdown'}) - -client.publish(mqtt_client.MQTT_TOPIC, payload=j, qos=0, retain=False) - -time.sleep(2) - -client.loop_stop() -client.disconnect() +if __name__ == "__main__": + main()