nixos-config/mqtt/heater.py

92 lines
2.8 KiB
Python

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()