Commit 5b74279f authored by Peter-Bernd Otte's avatar Peter-Bernd Otte

More MQTT support.

parent e1782258
......@@ -13,6 +13,25 @@ broker="localhost"
mlast = {}
def on_connect(client, userdata, flags, rc):
if rc==0:
print("MQTT connected OK. Return code", rc)
client.subscribe("homie/i2c/1w/000006BB499E28") # Warmwasser
client.subscribe("homie/batterie/haus/gesamt")
client.subscribe("homie/batterie/pv/pv2")
client.subscribe("homie/batterie/batterie/soc")
client.subscribe("homie/lueftung/#")
client.subscribe("homie/batterie/pv/gesamt")
client.subscribe("homie/+/ac/leistung")
client.subscribe("homie/fsrmaster2/+/power")
print("MQTT: Subscribed to all topics")
else:
print("Bad connection. Return code=",rc)
def on_disconnect(client, userdata, rc):
if rc != 0:
print ("Unexpected MQTT disconnection. Will auto-reconnect")
def on_message(client, userdata, message):
global mlast
t = datetime.now()
......@@ -23,8 +42,10 @@ def on_message(client, userdata, message):
# the lambda in loads is for converting the object name into a int, if appropiate
j = json.loads(m, object_hook=lambda d: {int(k) if k.lstrip('-').isdigit() else k: v for k, v in d.items()})
# print ("Topic:",message.topic,"JSON",j)
if type(j) is not dict: #anpassen, falls es noch keine Zeitinfo hat
if type(j) is not dict: #anpassen, falls es keine Zeitinfo hat
j={'v':j,'time':t}
if t-j['time'] > 10: # corrects the time of too much in the future
j['time'] = t
mlast[message.topic] = j
......@@ -32,49 +53,75 @@ def on_message(client, userdata, message):
client= paho.Client("actor")
client.on_message=on_message
client.on_connect = on_connect
client.on_disconnect = on_disconnect
print("connecting to broker ",broker)
client.connect(broker)
client.subscribe("homie/i2c/1w/000006BB499E28") # Warmwasser
client.subscribe("homie/batterie/haus/gesamt")
client.subscribe("homie/batterie/pv/pv2")
client.subscribe("homie/lueftung/#")
client.subscribe("homie/batterie/pv/gesamt")
client.subscribe("homie/+/ac/leistung")
client.subscribe("homie/fsrmaster2/+/power")
client.loop_start() #start loop to process received messages in separate thread
print ("MQTT Loop started.")
# Test, ob die angegebenen MQTT-Variablen vorhanden sind und Zahlenwerte haben
# Test, ob die angegebenen MQTT-Variablen: vorhanden sind und Zahlenwerte haben und nicht zu alt sind
# Aufruf: if checkValuesOK(['homie/fsrmaster2/stromz2/power','homie/fsrmaster2/stromz0/power']):
def checkValuesOK(alist):
r = True
global mlast
for v in alist:
w = mlast.get(v)
if w and isinstance(w['v'], numbers.Real):
if w and isinstance(w['v'], numbers.Real) and time.time()-w['time'] < 60*5:
pass
else:
r = False
return r
#0:400W, 1:700W, 2:700W
Heizstaebe = [{'P':0,'time':0,'SenderID':77135873,'Pmax':400}, {'P':0,'time':0,'SenderID':77135874,'Pmax':700}, {'P':0,'time':0,'SenderID':77135875,'Pmax':700}]
while True:
if checkValuesOK(['homie/i2c/1w/000006BB499E28', 'homie/fsrmaster2/stromz0/power', 'homie/batterie/pv/gesamt']):
print ("PV:",mlast['homie/batterie/pv/gesamt']['v'],"Z0:",mlast['homie/fsrmaster2/stromz0/power']['v'],"Wassertemp ("+str(mlast['homie/i2c/1w/000006BB499E28']['v'])+"): ",end='')
if mlast['homie/i2c/1w/000006BB499E28']['v'] < 60:
print("Heizen!", end='')
if (mlast['homie/batterie/pv/gesamt']['v'] > 1400) and (mlast['homie/fsrmaster2/stromz0/power']['v']<-1400):
html = urlopen("http://dom/changeStatus.php?newQ=-1&ActiveTab=&SenderID=77135875&Data=100", timeout = 1)
html = urlopen("http://dom/changeStatus.php?newQ=-1&ActiveTab=&SenderID=77135874&Data=100", timeout = 1)
#print (html.read())
print("mit 1400W")
elif (mlast['homie/batterie/pv/gesamt']['v'] > 700) and (mlast['homie/fsrmaster2/stromz0/power']['v']<-700):
html = urlopen("http://dom/changeStatus.php?newQ=-1&ActiveTab=&SenderID=77135874&Data=100", timeout = 1)
print("mit 700W")
SummeAktHeizleistung=0
for i in range(len(Heizstaebe)):
if time.time()-Heizstaebe[i]['time'] > 30: Heizstaebe[i]['P']=0
SummeAktHeizleistung += Heizstaebe[i]['P']
if checkValuesOK(['homie/i2c/1w/000006BB499E28', 'homie/fsrmaster2/stromz0/power', 'homie/batterie/batterie/soc', 'homie/batterie/pv/gesamt']):
print ("SummeAktHeizleistung:",SummeAktHeizleistung,"SOC",mlast['homie/batterie/batterie/soc']['v'],"PV:",mlast['homie/batterie/pv/gesamt']['v'],"Z0:",mlast['homie/fsrmaster2/stromz0/power']['v'],"Wassertemp ("+str(mlast['homie/i2c/1w/000006BB499E28']['v'])+"): ",end='')
if mlast['homie/i2c/1w/000006BB499E28']['v'] <= 60:
if mlast['homie/batterie/batterie/soc']['v']==100 or mlast['homie/batterie/pv/gesamt']['v']>4000:
print("Heizen! ", end='')
PVLeistung = mlast['homie/batterie/pv/gesamt']['v']
VerbleibendeLeistung = -1*mlast['homie/fsrmaster2/stromz0/power']['v']+SummeAktHeizleistung
if mlast['homie/i2c/1w/000006BB499E28']['v'] >59:
if mlast['homie/i2c/1w/000006BB499E28']['v'] >=60:
VerbleibendeLeistung=150 if VerbleibendeLeistung>150 else VerbleibendeLeistung
elif mlast['homie/i2c/1w/000006BB499E28']['v'] >59.75:
VerbleibendeLeistung=200 if VerbleibendeLeistung>200 else VerbleibendeLeistung
else:
VerbleibendeLeistung=750 if VerbleibendeLeistung>750 else VerbleibendeLeistung
print("Heizleistung begrenzt auf:",VerbleibendeLeistung)
print("Verteilen:", VerbleibendeLeistung, end='')
if PVLeistung < VerbleibendeLeistung: VerbleibendeLeistung = PVLeistung # Abfrage zur Vermeidung, dass auf kurze Leistungsspitzen reagiert wird
if VerbleibendeLeistung > 0:
for i in range(1,len(Heizstaebe)): #Switch on FSR14-2x
if VerbleibendeLeistung>Heizstaebe[i]['Pmax']:
client.publish("homie/fsr-ww-control/wwHeizstab/relais/stab"+str(i+1)+"/set", 1)
# html = urlopen("http://dom/changeStatus.php?newQ=-1&ActiveTab=&SenderID="+str(Heizstaebe[i]['SenderID'])+"&Data=100", timeout = 1)
Heizstaebe[i]['P']=700
VerbleibendeLeistung -= Heizstaebe[i]['P']
Heizstaebe[i]['time']=time.time()
#print (html.read())
for i in range(1): #Switch on FUD14
if VerbleibendeLeistung>40:
HeizProzent = round(VerbleibendeLeistung / 4) if VerbleibendeLeistung < 400 else 100
client.publish("homie/fsr-ww-control/wwHeizstab/dimmer/stab1/set", HeizProzent/100)
# html = urlopen("http://dom/changeStatus.php?newQ=-1&ActiveTab=&SenderID="+str(Heizstaebe[i]['SenderID'])+"&Data="+str(HeizProzent), timeout = 1)
Heizstaebe[i]['P']=HeizProzent*4
VerbleibendeLeistung -= Heizstaebe[i]['P']
Heizstaebe[i]['time']=time.time()
print("HeizProzent",HeizProzent)
print("VerbleibendeLeistung",VerbleibendeLeistung)
else:
print("Aber nicht genug Sonnenpower vorhanden.")
else:
print("Aber nicht genug Sonnenpower vorhanden.")
print("Batterie entweder nicht voll oder P(PV)<4kW.")
else:
print("nicht weiter heizen, heiß genug.")
......@@ -84,9 +131,9 @@ while True:
if checkValuesOK(['homie/pv1/ac/leistung','homie/pv3/ac/leistung','homie/pv4/ac/leistung']):
client.publish("homie/check/pv/power", mlast['homie/pv1/ac/leistung']["v"] +mlast['homie/pv3/ac/leistung']["v"] +mlast['homie/pv4/ac/leistung']["v"])
time.sleep(10)
time.sleep(5)
#client.loop_forever()
client.disconnect()
client.loop_stop()
client.loop_stop()
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment