from paho.mqtt import client as mqtt_client import paho.mqtt.publish as publ import random import threading import json import psutil from time import sleep FIRST_RECONNECT_DELAY = 1 RECONNECT_RATE = 2 MAX_RECONNECT_COUNT = 12 MAX_RECONNECT_DELAY = 60 broker = '10.0.69.69' port = 1883 topics = ["tele/+/STATE", "stat/+/POWER"] client_id = f'python-mqtt-{random.randint(0, 1000)}' username = 'mosquitto' password = 'Terra_Taonas' powerState = {} microphone = {} headphones = {} try: with open("./mic.json", "r") as f: microphone = json.load(f) except: print("No mic.json file found, microphone will not be controlled") try: with open("./hp.json", "r") as f: headphones = json.load(f) except: print("No hp.json file found, headphones will not be controlled") def process_status(process_name): for process in psutil.process_iter(['pid', 'name']): if process.info['name'] == process_name: return True return False def connect_mqtt(): def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected to MQTT Broker!") else: print("Failed to connect, return code %d\n", rc) client = mqtt_client.Client(client_id) client.username_pw_set(username, password) client.on_connect = on_connect client.connect(broker, port) return client def subscribe(client: mqtt_client): def on_message(client, userdata, msg): topic = msg.topic if "tele" in topic: if "STATE" in topic: data = json.loads(msg.payload.decode()) device = topic.split('/')[1] powerState[device] = data['POWER'] if "stat" in topic: device = topic.split('/')[1] powerState[device] = msg.payload.decode() print(powerState) for topic in topics: client.subscribe(topic) client.on_message = on_message def subscribe_state(): client = connect_mqtt() subscribe(client) client.loop_forever() def checkHeadphones(): enable = False for app in headphones["Apps"]: if process_status(app): enable = True if enable: try: if powerState['swhpamp'] == "OFF": publ.single("cmnd/swhpamp/POWER", "on", hostname=broker, port=port, auth={'username':username,'password':password}) except Exception as e: print(e) def checkMicrophone(): enable = False for app in microphone["Apps"]: if process_status(app): enable = True if enable: try: if powerState['swmicamp'] == "OFF": publ.single("cmnd/swmicamp/POWER", "on", hostname=broker, port=port, auth={'username':username,'password':password}) except Exception as e: print(e) else: try: if powerState['swmicamp'] == "ON": publ.single("cmnd/swmicamp/POWER", "off", hostname=broker, port=port, auth={'username':username,'password':password}) except Exception as e: print(e) if __name__ == "__main__": sub=threading.Thread(target=subscribe_state) sub.start() sleep(5) while True: checkMicrophone() checkHeadphones() sleep(1)