From 15a004c59a985fcd1296a57291856e9161f9adcc Mon Sep 17 00:00:00 2001 From: lukario Date: Fri, 16 Apr 2021 17:14:07 +0200 Subject: [PATCH] Forken wir mal den Club --- heizberry_control.py | 132 ++++++++++++++++++++++++++++++++++++++ heizberry_control.service | 13 ++++ heizberry_io.py | 116 +++++++++++++++++++++++++++++++++ heizberry_io.service | 13 ++++ 4 files changed, 274 insertions(+) create mode 100755 heizberry_control.py create mode 100644 heizberry_control.service create mode 100755 heizberry_io.py create mode 100644 heizberry_io.service diff --git a/heizberry_control.py b/heizberry_control.py new file mode 100755 index 0000000..9080a69 --- /dev/null +++ b/heizberry_control.py @@ -0,0 +1,132 @@ +#!/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 Zimmer: + name = None + automatic = None + temperaturSet = None + statusActual = None + + + +zimmer = [Zimmer] +zimmerName =["alexander"] +zimmerAutomatic = [0] +zimmerTemperaturSet = [0.0] +zimmerStatusActual = [0] + +for i in range(len(zimmer)): + zimmer[i].name = zimmerName[i] + zimmer[i].automatic = zimmerAutomatic[i] + zimmer[i].temperaturSet = zimmerTemperaturSet[i] + zimmer[i].statusActual = zimmerStatusActual[i] + + +def on_connect(client, userdata, flags, rc): + log.debug("Connected with result code " + str(rc)) + + for i in zimmer: + + client.subscribe("zimmer/" + i.name + "/heizung/homeassistant/automatic") + client.subscribe("zimmer/" + i.name + "/heizung/homeassistant/temperatur") + client.subscribe("zimmer/" + i.name + "/heizung/homeassistant/status") + client.subscribe("zimmer/" + i.name + "/heizung/temperatur") + client.subscribe("zimmer/" + i.name + "/heizung/status") +# client.subscribe("zimmer/" + i.name + "/sensoren/tuer/status") +# client.subscribe("zimmer/" + i.name + "/sensoren/fenster/status") +# client.subscribe("zimmer/" + i.name + "/sensoren/temperatur") + + 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] == "heizung": + if message.topic.split("/", -1)[3] == "homeassistant": + if message.topic.split("/", -1)[4] == "automatic": + for i in zimmer: + if message.topic.split("/", -1)[1] == i.name: + i.automatic = bool(msg) + if message.topic.split("/", -1)[4] == "temperatur": + for i in zimmer: + if message.topic.split("/", -1)[1] == i.name: + i.temperaturSet = round(float(msg),1) + if message.topic.split("/", -1)[3] == "status": + for i in zimmer: + if message.topic.split("/", -1)[1] == i.name: + i.statusActual = bool(msg) + + + sendReadings() + +def sendReadings(): + + for i in zimmer: + + if i.automatic: + client.publish("zimmer/" + i.name + "/heizung/temperatur", i.temperaturSet, qos=1, retain=True) + client.publish("zimmer/" + i.name + "/heizung/homeassistant/status", i.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/homeassistant_services/heizberry_control.log', level=logging.DEBUG, 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) diff --git a/heizberry_control.service b/heizberry_control.service new file mode 100644 index 0000000..743687d --- /dev/null +++ b/heizberry_control.service @@ -0,0 +1,13 @@ +[Unit] +Description=homeassistent_thermostat +After=network-online.target + +[Service] +Type=simple +ExecStart=/srv/homeassistent_services/heizberry_control.py + +Restart=always +RestartSec=20 + +[Install] +WantedBy=multi-user.target diff --git a/heizberry_io.py b/heizberry_io.py new file mode 100755 index 0000000..5663966 --- /dev/null +++ b/heizberry_io.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 + +import argparse +import re +import time +import signal +import logging +import sys +import schedule +import paho.mqtt.client as mqtt +from eq3bt import Thermostat + + +class Zimmer: + name = None + thermostat = None + + +zimmer = [Zimmer] +zimmerName = ["alexander"] +zimmerThermostat = [Thermostat('00:1A:22:16:4B:B4')] + +for i in range(len(zimmer)): + zimmer[i].name = zimmerName[i] + zimmer[i].thermostat = zimmerThermostat[i] + + +def on_connect(client, userdata, flags, rc): + log.debug("Connected with result code " + str(rc)) + + for i in zimmer: + client.subscribe("zimmer/" + i.name + "/heizung/temperatur") + client.subscribe("zimmer/" + i.name + "/heizung/status") + + 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] == "heizung": + if message.topic.split("/", -1)[3] == "temperatur": + for i in zimmer: + if message.topic.split("/", -1)[1] == i.name: + i.thermostat.mode= 3 + i.thermostat.target_temperature = round(float(msg),1) + + + sendReadings() + + + +def sendReadings(): + log.debug('read target temperature from thermostats') + + for i in zimmer: + + i.thermostat.update() + + if i.thermostat.target_temperature > 17.0: + client.publish("zimmer/" + i.name + "/heizung/status", 1, qos=1, retain=True) + else: + client.publish("zimmer/" + i.name + "/heizung/status", 0, 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/homeassistant_services/heizberry_io.log', level=logging.DEBUG, 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("localThermostatIo") + 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) diff --git a/heizberry_io.service b/heizberry_io.service new file mode 100644 index 0000000..dc48635 --- /dev/null +++ b/heizberry_io.service @@ -0,0 +1,13 @@ +[Unit] +Description=homeassistent_thermostat +After=network-online.target + +[Service] +Type=simple +ExecStart=/srv/homeassistent_services/heizberry_io.py + +Restart=always +RestartSec=20 + +[Install] +WantedBy=multi-user.target