mirror of
https://github.com/c3e/Heizberry.git
synced 2024-04-01 15:11:26 +00:00
Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
89a7a0addb | |||
6e8ecf2977 | |||
afae8b4016 | |||
37c0fc4320 | |||
6f81666386 | |||
67a4b85867 | |||
2ae081198f | |||
1834211e89 | |||
a410dc90ef | |||
8eba2c198c | |||
99415291ea | |||
6f4f1ee9fd | |||
1aa07e8ff2 | |||
d9fbd1af5a | |||
15a004c59a |
138
heizberry.py
138
heizberry.py
@ -1,138 +0,0 @@
|
||||
#!/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
|
||||
|
||||
thermostatBallpit = Thermostat('00:1A:22:0D:BE:EE')
|
||||
thermostatCantina = Thermostat('00:1A:22:0D:C2:5D')
|
||||
|
||||
|
||||
temperature_off = 12
|
||||
temperature_on = 19
|
||||
|
||||
|
||||
def on_connect(client, userdata, flags, rc):
|
||||
log.debug("Connected with result code " + str(rc))
|
||||
|
||||
client.subscribe("foobar/oben/baellebad/heizung/action")
|
||||
client.subscribe("foobar/oben/cantina/heizung/action")
|
||||
|
||||
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))
|
||||
|
||||
# Baellebad
|
||||
if (message.topic == "foobar/oben/baellebad/heizung/action"):
|
||||
thermostatBallpit.mode="manual"
|
||||
if (msg == "on"):
|
||||
thermostatBallpit.target_temperature=temperature_on
|
||||
else:
|
||||
if (msg == "off"):
|
||||
thermostatBallpit.target_temperature=temperature_off
|
||||
else:
|
||||
thermostatBallpit.target_temperature=round(float(msg),1)
|
||||
|
||||
# Cantina
|
||||
if (message.topic == "foobar/oben/cantina/heizung/action"):
|
||||
thermostatCantina.mode="manual"
|
||||
if (msg == "on"):
|
||||
thermostatCantina.target_temperature=temperature_on
|
||||
else:
|
||||
if (msg == "off"):
|
||||
thermostatCantina.target_temperature=temperature_off
|
||||
else:
|
||||
thermostatCantina.target_temperature=round(float(msg),1)
|
||||
sendReadings()
|
||||
|
||||
def sendReadings():
|
||||
log.debug('read target temperature from thermostats')
|
||||
|
||||
# Bällebad
|
||||
# Update readings
|
||||
thermostatBallpit.update()
|
||||
|
||||
# Send target temperatures
|
||||
temp=thermostatBallpit.target_temperature
|
||||
client.publish("foobar/oben/baellebad/heizung/status", temp, qos=1, retain=True)
|
||||
if(temp == temperature_on):
|
||||
client.publish("foobar/oben/baellebad/heizung/status", "on", qos=1, retain=True)
|
||||
if(temp == temperature_off):
|
||||
client.publish("foobar/oben/baellebad/heizung/status", "off", qos=1, retain=True)
|
||||
|
||||
# Cantina
|
||||
# Update readings
|
||||
thermostatCantina.update()
|
||||
|
||||
# Send target temperatures
|
||||
temp=thermostatCantina.target_temperature
|
||||
client.publish("foobar/oben/cantina/heizung/status", temp, qos=1, retain=True)
|
||||
if(temp == temperature_on):
|
||||
client.publish("foobar/oben/cantina/heizung/status", "on", qos=1, retain=True)
|
||||
if(temp == temperature_off):
|
||||
client.publish("foobar/oben/cantina/heizung/status", "off", 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(
|
||||
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("Heizberry_oben")
|
||||
client.on_connect = on_connect
|
||||
client.on_message = on_message
|
||||
client.connect("10.42.0.244", 1883, 60)
|
||||
log.debug('connected mqtt client')
|
||||
|
||||
client.loop_start()
|
||||
|
||||
log.debug('schedule periodic readings')
|
||||
schedule.every(60).seconds.do(sendReadings)
|
||||
|
||||
time.sleep(10)
|
||||
|
||||
while True:
|
||||
schedule.run_pending()
|
||||
time.sleep(1)
|
||||
|
131
heizberry_control.py
Executable file
131
heizberry_control.py
Executable file
@ -0,0 +1,131 @@
|
||||
#!/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)
|
13
heizberry_control.service
Normal file
13
heizberry_control.service
Normal file
@ -0,0 +1,13 @@
|
||||
[Unit]
|
||||
Description=homeassistent_thermostat
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/srv/heizberry/heizberry_control.py
|
||||
|
||||
Restart=always
|
||||
RestartSec=20
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
118
heizberry_io.py
Executable file
118
heizberry_io.py
Executable file
@ -0,0 +1,118 @@
|
||||
#!/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 Room:
|
||||
name = None
|
||||
thermostat = None
|
||||
|
||||
|
||||
rooms = [Room(), Room(), Room(), Room(), Room(), Room()]
|
||||
roomName = ["alexander", "livingroom", "bathroom", "kitchen", "christina", "simon"]
|
||||
roomThermostat = ["00:1A:22:16:4B:B4", "00:1A:22:16:25:C3", "00:1A:22:16:2C:20", "00:1A:22:16:26:06", "00:1A:22:16:26:75", "00:1A:22:16:2C:85"]
|
||||
|
||||
for i in range(len(rooms)):
|
||||
rooms[i].name = roomName[i]
|
||||
rooms[i].thermostat = roomThermostat[i]
|
||||
|
||||
|
||||
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/actor/temperature")
|
||||
client.subscribe("room/" + room.name + "/heating/actor/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))
|
||||
|
||||
for room in rooms:
|
||||
tmpThermostat = Thermostat(room.thermostat)
|
||||
if message.topic.split("/", -1)[2] == "heating":
|
||||
if message.topic.split("/", -1)[3] == "actor":
|
||||
if message.topic.split("/", -1)[4] == "temperature":
|
||||
if message.topic.split("/", -1)[1] == room.name:
|
||||
tmpThermostat.mode= 3
|
||||
tmpThermostat.target_temperature = round(float(msg),1)
|
||||
|
||||
sendReadings()
|
||||
|
||||
|
||||
|
||||
def sendReadings():
|
||||
log.debug('read target temperature from thermostat')
|
||||
|
||||
for room in rooms:
|
||||
tmpThermostat = Thermostat(room.thermostat)
|
||||
|
||||
tmpThermostat.update()
|
||||
|
||||
if tmpThermostat.target_temperature > 17.0:
|
||||
client.publish("room/" + room.name + "/heating/actor/status", 1, qos=1, retain=True)
|
||||
else:
|
||||
client.publish("room/" + room.name + "/heating/actor/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/heizberry/heizberry_io.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("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)
|
@ -1,10 +1,10 @@
|
||||
[Unit]
|
||||
Description=heizberry
|
||||
Description=homeassistent_thermostat
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/srv/heizberry/heizberry.py
|
||||
ExecStart=/srv/heizberry/heizberry_io.py
|
||||
|
||||
Restart=always
|
||||
RestartSec=20
|
Reference in New Issue
Block a user