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 import datetime import os 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 = {} 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 ping(host): return os.system(f"ping -c 1 {host} > /dev/null") == 0 def checkPC(): t = datetime.datetime.now() h = int(t.strftime("%H")) if h < 6 or h >= 23: if not ping("10.69.42.5"): try: if powerState['swhpamp'] == "ON": publ.single("cmnd/swhpamp/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: checkPC() sleep(1)