Heizberry/heizberry_control.py

132 lines
4.0 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
import re
import time
import signal
import logging
import sys
import schedule
import paho.mqtt.client as mqtt
class Room:
name = None
automatic = None
temperatureSet = None
statusActual = None
rooms = [Room(), Room(), Room(), Room(), Room(), Room()]
roomName =["alexander", "livingroom", "bathroom", "christina", "kitchen", "simon"]
for i in range(len(rooms)):
rooms[i].name = roomName[i]
rooms[i].automatic = 0
rooms[i].temperatureSet = 0.0
rooms[i].statusActual = 0
def on_connect(client, userdata, flags, rc):
log.debug("Connected with result code " + str(rc))
for room in rooms:
client.subscribe("room/" + room.name + "/heating/control/automatic")
client.subscribe("room/" + room.name + "/heating/control/temperature")
client.subscribe("room/" + room.name + "/heating/control/status")
client.subscribe("room/" + room.name + "/heating/actor/temperature")
client.subscribe("room/" + room.name + "/heating/actor/status")
# client.subscribe("room/" + room.name + "/sensoren/tuer/status")
# client.subscribe("room/" + room.name + "/sensoren/fenster/status")
# client.subscribe("room/" + room.name + "/sensoren/temperature")
sendReadings()
def on_publish(client, userdata, mid):
log.debug("mid: "+str(mid))
def on_message(client, userdata, message):
msg = message.payload.decode("utf-8")
log.debug('received message: %s from %s', format(msg), format(message.topic))
if message.topic.split("/", -1)[2] == "heating":
if message.topic.split("/", -1)[3] == "control":
if message.topic.split("/", -1)[4] == "automatic":
for room in rooms:
if message.topic.split("/", -1)[1] == room.name:
room.automatic = bool(msg)
if message.topic.split("/", -1)[4] == "temperature":
for room in rooms:
if message.topic.split("/", -1)[1] == room.name:
room.temperatureSet = round(float(msg),1)
if message.topic.split("/", -1)[3] == "actor":
if message.topic.split("/", -1)[4] == "status":
for room in rooms:
if message.topic.split("/", -1)[1] == room.name:
room.statusActual = bool(msg)
sendReadings()
def sendReadings():
for room in rooms:
if room.automatic:
client.publish("room/" + room.name + "/heating/actor/temperature", room.temperatureSet, qos=1, retain=True)
client.publish("room/" + room.name + "/heating/control/status", room.statusActual, qos=1, retain=True)
log.debug('sent readings')
def terminate(signum, frame):
log.warn('SIGTERM received. Shutting down!')
log.info('stopping mqtt client')
client.loop_stop()
log.info('disconnecting mqtt client')
client.disconnect()
log.info('heizberry stopped all functions; exit')
sys.exit(0)
def getArgs():
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", action="store_true",
help="increase output verbosity")
return parser.parse_args()
if __name__ == '__main__':
signal.signal(signal.SIGINT, terminate)
args = getArgs()
logging.basicConfig(filename='/var/log/heizberry/heizberry_control.log', level=logging.WARN, format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
log = logging.getLogger('heizberry')
if args.verbose:
log.setLevel(logging.DEBUG)
log.info('Loglevel set to DEBUG')
else:
log.setLevel(logging.WARN)
log.debug('start mqtt client')
client = mqtt.Client("localThermostatControl")
client.on_connect = on_connect
client.on_message = on_message
client.connect("192.168.1.24", 1883, 60)
log.debug('connected mqtt client')
client.loop_start()
log.debug('schedule periodic readings')
schedule.every(60).seconds.do(sendReadings)
time.sleep(10)