import time import paho.mqtt.client as mqtt import json import threading # initial scene from heater.modules.heater import Heater from heater.modules.watcher import Watcher scene = "default" watcher = Watcher({ "office1": Heater(topic="zigbee2mqtt/heater1", set_topic="zigbee2mqtt/heater1/set"), "office2": Heater(topic="zigbee2mqtt/heater2", set_topic="zigbee2mqtt/heater2/set"), "bedroom": Heater(topic="zigbee2mqtt/heater3", set_topic="zigbee2mqtt/heater3/set"), }) # The callback for when the client receives a CONNACK response from the server. def on_connect(client, _userdata, _flags, rc): print("Connected with result code " + str(rc)) threading.Thread(target=loop_thread, args=(client,), daemon=True).start() # Subscribing in on_connect() means that if we lose the connection and # reconnect then subscriptions will be renewed. client.subscribe("control/lights/set") for topic in watcher.get_topics(): client.subscribe(topic) watcher.pull_values(client) # The callback for when a PUBLISH message is received from the server. def on_message(client, _userdata, msg): global scene (topic, payload) = parse_message(msg) if topic == "control/lights/set": print("set scene %s -> %s" % (scene, payload['scene'])) scene = payload['scene'] update_scene(client) else: print("got %s" % topic) watcher.update_actual_heating_point_for_topic(topic, payload) #watcher.publish(client) def parse_message(msg): m_decode = str(msg.payload.decode("utf-8", "ignore")) payload = json.loads(m_decode) # decode json data return msg.topic, payload def update_scene(client): if scene == "night": watcher.update("office1", 10) watcher.update("office2", 10) watcher.update("bedroom", 13) elif scene == "default": watcher.update("office1", 23) watcher.update("office2", 23) watcher.update("bedroom", 18) elif scene == "outside": watcher.update("office1", 10) watcher.update("office2", 10) watcher.update("bedroom", 13) else: watcher.update("office1", 10) watcher.update("office2", 10) watcher.update("bedroom", 13) watcher.publish(client) def loop_thread(client): while True: watcher.publish(client) time.sleep(120) if __name__ == "__main__": mqttClient = mqtt.Client() mqttClient.on_connect = on_connect mqttClient.on_message = on_message mqttClient.username_pw_set("homeassistant", password="password") mqttClient.connect("pepe.private", 1883, 60) # Blocking call that processes network traffic, dispatches callbacks and # handles reconnecting. # Other loop*() functions are available that give a threaded interface and a # manual interface. mqttClient.loop_forever()