Heating and Ventilation Control
EnergyManager
Keine Erläuterungen gefunden.
import time from datetime import datetime import threading import queue from paho.mqtt import client as mqtt_client import json from HvcMqtt import HvcMqtt from HvcOperationMode import HvcOperationMode from HvcWifiRelay import HvcWifiRelay #from HvcTemperatureControl import HvcTemperatureControl from HvcLightControl import HvcLightControl myMqtt = HvcMqtt() myMqtt.initialize() OM = HvcOperationMode() myWR = HvcWifiRelay() myMqtt.genZigbeeMap() #ping sensors once for initial values myLC = HvcLightControl() myLC.getSunSet() def secondContainer(myMqtt, OM, myWR, relayDict, myLC): """ These functions are executed each second. """ #check configuration files for changes operationMode,parameters,changed = OM.read() #on change, react spontaneouly if changed: print("detected change of OperationMode") now = datetime.now() today = now.strftime("%Y-%m-%d") hour = now.strftime("%H") minute = now.strftime("%M") myWR.actual = TempControl(myMqtt.actual["T"],OM.parameters,myWR.actual,relayDict,True) myWR.switch(myWR.actual) myWR.writeLog(today, hour, minute, 5E-3, relayDict) writeState(now,myMqtt.actual,OM.parameters,myWR.actual,relayDict,myLC) return def minuteContainer(myMqtt, OM, myWR, relayDict, myLC): """ These functions are executed each minute. """ now = datetime.now() today = now.strftime("%Y-%m-%d") hour = now.strftime("%H") minute = now.strftime("%M") vars, sensState = myMqtt.processQueue() #safe to logfile or control something... anyChange = myMqtt.writeLog(today, hour, minute) if anyChange: #print(str(hour)+":"+str(minute), vars["T"], vars["phi"], vars["p"], sensState) myWR.actual = TempControl(myMqtt.actual["T"],OM.parameters,myWR.actual,relayDict) myWR.switch(myWR.actual) myWR.writeLog(today, hour, minute, relayDict) if((int(hour)==0 or int(hour)==6 or int(hour)==12 or int(hour)==23) and int(minute)==1): myWR.writeLog(today, hour, minute, relayDict, True) myLC.getSunSet() myWR.actual, anyChange = myLC.exteriorLight(OM.parameters,myWR.actual) if anyChange: myWR.switch(myWR.actual) myWR.writeLog(today, hour, minute, relayDict) writeState(now,myMqtt.actual,OM.parameters,myWR.actual,relayDict, myLC,sensState) return secCount = 0 def mainLoop(): """ loop for ever, execute secondContainer and minuteContainer cyclically """ #here you may map some sensor to any relay relayDict = {} relayDict["S01"] = "OG4" relayDict["S02"] = "none" relayDict["S03"] = "none" relayDict["S04"] = "none" relayDict["S05"] = "none" relayDict["S06"] = "none" relayDict["S07"] = "none" relayDict["S08"] = "none" relayDict["S09"] = "none" relayDict["S10"] = "none" relayDict["LC1"] = "LC1" global secCount secCount= secCount+1 #call itself to loop forever, each 1 second threading.Timer(1, mainLoop).start() secondContainer(myMqtt, OM, myWR, relayDict, myLC) if secCount >= 60: # each 60 sec secCount = 0 minuteContainer(myMqtt, OM, myWR, relayDict, myLC) def TempControl(T, parameter, relayStates, relayDict, debug=False): #optionally invert the logic: on = 1 off = 0 sensors = T.keys() for s in sensors: try: if T[s] > parameter[s] + parameter["hysteresis"]: relayStates[relayDict[s]] = off msg = s+": actual="+str(T[s])+" setpoint="+str(parameter[s])+" switch:off" elif T[s] < parameter[s] - parameter["hysteresis"]: relayStates[relayDict[s]] = on msg = s+": actual="+str(T[s])+" setpoint="+str(parameter[s])+" switch:on" else: #otherwise, keep state msg = s+": actual="+str(T[s])+" setpoint="+str(parameter[s])+" within hysteresis" if debug: print(msg) except: relayStates[relayDict[s]] = off return relayStates def writeState(now,sensors,parameters,actuators,relayDict, myLC,sensState={}): file = "./LogDir/state.dat" today = now.strftime("%Y-%m-%d") hour = now.strftime("%H") minute = now.strftime("%M") logDict = {} logDict["date"] = today logDict["time"] = hour+":"+minute logDict["sunRise"] = myLC.sunRise logDict["sunSet"] = myLC.sunSet names = sensors["T"].keys() for s in names: logDict[s] = {} fields = [] fields.append("date") #0 fields.append("time") #1 fields.append("T") #2 fields.append("phi") #3 fields.append("p") #4 fields.append("relay") #5 fields.append("setpoint") #6 fields.append("state") #7 for s in names: for i,f in enumerate(fields): if i>1 and i<5: logDict[s][f] = sensors[f][s] elif i == 5: try: logDict[s][f] = actuators[relayDict[s]] except: logDict[s][f] = -1 elif i == 6: logDict[s][f] = parameters[s] elif i == 7: try: logDict[s][f] = sensState[s] except: continue with open(file, 'w') as outfile: json.dump(logDict, outfile) """ main programm, execute mainLoop() cyclically """ mainLoop()
Index of Library
Der gesamte Sourcecode darf gemäß GNU General Public License weiterverbreitet werden.