Skip to content

Instantly share code, notes, and snippets.

@abnoname
Created March 24, 2024 18:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save abnoname/b1fe585e8cf064b6729a150a3339c7a3 to your computer and use it in GitHub Desktop.
Save abnoname/b1fe585e8cf064b6729a150a3339c7a3 to your computer and use it in GitHub Desktop.
Vitocal Taktoptimierung
from threading import Thread
from time import sleep
from paho.mqtt.client import Client
import datetime
BASE_TOPIC = "open3e"
#BASE_TOPIC = "open3e_sim"
# Constants
TOPIC_TEMPERATURE = BASE_TOPIC + "/274_OutsideTemperatureSensor/Actual"
#TOPIC_HEATPUMP = BASE_TOPIC + "/2351_HeatPumpCompressor_Test"
TOPIC_HEATPUMP = BASE_TOPIC + "/2351_HeatPumpCompressor"
TOPIC_CMND = BASE_TOPIC + "/cmnd"
TOPIC_LOCKED = BASE_TOPIC + "/locked"
TOPIC_ALIVE = BASE_TOPIC + "/locked_alive"
THRESHOLD = 5.0
LOCKTIME = 3600*2
#LOCK_VAL = '{"mode": "write", "data":[[881,{"Gradient": 0.3, "Level": -13.0, "BasePoint": -30.0}]]}'
#UNLOCK_VAL = '{"mode": "write", "data":[[881,{"Gradient": 0.3, "Level": 4.0, "BasePoint": -30.0}]]}'
#LOCK_VAL = '{"mode": "write", "data":[[1193,{"Minimum": 20.0, "Maximum": 20.0, "Unknown": "000000000000"}]]}'
#UNLOCK_VAL = '{"mode": "write", "data":[[1193,{"Minimum": 20.0, "Maximum": 55.0, "Unknown": "000000000000"}]]}'
LOCK_VAL = '{"mode": "write", "data":[[1192,{"Minimum": 20.0, "Maximum": 20.0, "Unknown": "000000000000"}]]}'
UNLOCK_VAL = '{"mode": "write", "data":[[1192,{"Minimum": 20.0, "Maximum": 55.0, "Unknown": "000000000000"}]]}'
# Return Sperre WW
BEFOREWW_1 = datetime.datetime.strptime('12:30', '%H:%M')
BEFOREWW_2 = datetime.datetime.strptime('13:05', '%H:%M')
WW_TIMEADD = 35
FSM_STATE_IDLE = 0
FSM_STATE_LOCK = 1
FSM_STATE_WAITUNLOCK = 2
FSM_STATE_UNLOCK = 3
alive = 1
prev_compressor = 0
compressor = 0
temperature = 10.0
locktime = datetime.datetime.now()
fsmstate = FSM_STATE_UNLOCK # assume locked on start -> fail safe unlock
def on_connect(mosq, obj, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
mosq.subscribe([(TOPIC_TEMPERATURE, 1), (TOPIC_HEATPUMP, 1)])
else:
print("Failed to connect, return code %d\n", rc)
def on_publish(client,userdata,result): #create function for callback
print("data published")
pass
def on_message(mosq, obj, msg):
global prev_compressor
global compressor
global temperature
global locktime
global alive
global fsmstate
mqttc.publish(TOPIC_ALIVE, alive)
alive = alive + 1
if(alive > 9):
alive = 0
if TOPIC_TEMPERATURE in msg.topic:
temperature = float(msg.payload.decode())
print("temperature", temperature)
if TOPIC_HEATPUMP in msg.topic:
prev_compressor = compressor
compressor = int(float(msg.payload))
print("compressor", compressor)
if(fsmstate == FSM_STATE_IDLE):
print("FSM_STATE_IDLE")
if(temperature > THRESHOLD):
if(prev_compressor == 1 and compressor == 0):
print("Locking...")
fsmstate = FSM_STATE_LOCK
elif(fsmstate == FSM_STATE_LOCK):
print("FSM_STATE_LOCK")
mqttc.publish(TOPIC_CMND, LOCK_VAL)
mqttc.publish(TOPIC_LOCKED, 1)
locktime = datetime.datetime.now()
print("Starting timer... Current:", locktime)
fsmstate = FSM_STATE_WAITUNLOCK
elif(fsmstate == FSM_STATE_WAITUNLOCK):
timer = (datetime.datetime.now() - locktime).total_seconds()
print("FSM_STATE_WAITUNLOCK",timer)
if(timer >= LOCKTIME):
if BEFOREWW_1.time() <= datetime.datetime.now().time() <= BEFOREWW_2.time():
print("Unlock in before WW time -> shift timer from", locktime)
locktime = locktime + datetime.timedelta(minutes=WW_TIMEADD)
print("to", locktime)
fsmstate = FSM_STATE_WAITUNLOCK
else:
fsmstate = FSM_STATE_UNLOCK
elif(fsmstate == FSM_STATE_UNLOCK):
print("FSM_STATE_UNLOCK")
print("Unlock at", datetime.datetime.now())
locked = 0
mqttc.publish(TOPIC_CMND, UNLOCK_VAL)
mqttc.publish(TOPIC_LOCKED, 0)
fsmstate = FSM_STATE_IDLE
mqttc = Client("Python")
#mqttc.username_pw_set("<USER>", "<PASSWORD>")
mqttc.on_connect = on_connect
mqttc.on_message = on_message
mqttc.on_publish = on_publish
mqttc.connect("192.168.0.5", 1883) # Replace <BROKER_ADDRESS> with your MQTT broker address
mqttc.reconnect_delay_set(min_delay=1, max_delay=30)
mqttc.loop_forever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment