diff --git a/hass_button_emulator.py b/hass_button_emulator.py new file mode 100755 index 0000000..49231e8 --- /dev/null +++ b/hass_button_emulator.py @@ -0,0 +1,36 @@ +#!/bin/python + +import time +import paho.mqtt.client as mqtt +import json + +MQTT_SERVER_ADDRESS = "localhost" +MQTT_SERVER_PORT = 1883 +MQTT_TOPIC = "homeassistant/device/mixer" + + +def on_connect(client, userdata, flags, reason_code, properties): + print(f"Connected: {reason_code}") + client.subscribe("#") + + +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_SERVER_ADDRESS, MQTT_SERVER_PORT, 60) +client.loop_start() + +j = json.dumps({"command": "scene_recall", "args": {"scene_id": 42}}) +# j = json.dumps({'command': 'shutdown'}) + +client.publish(MQTT_TOPIC, payload=j, qos=0, retain=False) + +time.sleep(2) + +client.loop_stop() +client.disconnect() diff --git a/mixer.py b/mixer.py index be22af4..a9d758b 100755 --- a/mixer.py +++ b/mixer.py @@ -157,7 +157,7 @@ class Mixer: self.sock.sendall(msg_bytes) def scene_recall(self, scene_id): - print(f"scene_recall: scene_id={scene_id}", scene_id) + print(f"scene_recall: scene_id={scene_id}") self.set_bank_1() msb = mido.Message("program_change", channel=0, program=scene_id) diff --git a/mqtt_client.py b/mqtt_client.py new file mode 100644 index 0000000..3ff7ed6 --- /dev/null +++ b/mqtt_client.py @@ -0,0 +1,54 @@ +#!/bin/python + +import argparse +import json + +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" + +m: Mixer = None + + +def on_connect(client, userdata, flags, reason_code, properties): + print(f"Connected: {reason_code}") + client.subscribe("#") + + +def on_message(client, userdata, msg): + payload = msg.payload.decode() + + print(f"{msg.topic}: {payload}") + + j = json.loads(payload) + + match j["command"]: + case "scene_recall": + m.scene_recall(j["args"]["scene_id"]) + case "shutdown": + m.shutdown() + + +def main(): + parser = argparse.ArgumentParser(description="Allen & Heath Qu MQTT Remote Control") + parser.add_argument("ip", help="IP of the mixer") + args = parser.parse_args() + print(f"IP: {args.ip}") + + global m + m = mixer.Mixer(args.ip, mixer.MIXER_PORT) + + 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.loop_forever() + + +if __name__ == "__main__": + main()