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 from HvcRollerShutter import HvcRollerShutter myMqtt = HvcMqtt() myMqtt.initialize() OM = HvcOperationMode() myWR = HvcWifiRelay() myMqtt.genZigbeeMap() #ping sensors once for initial values myLC = HvcLightControl(False) myLC.getSunSet() myRS = HvcRollerShutter() def secondContainer(myMqtt, OM, myWR, relayDict, myLC, myRS): """ 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.actual, anyChange = myLC.exteriorLight(OM,myWR.actual) myWR.switch(myWR.actual) myWR.writeLog(today, hour, minute, 5E-3, relayDict) writeState(now,myMqtt.actual,OM.parameters,myWR.actual,relayDict,myLC) OM.log(operationMode,today,hour,minute) #activation of RollerShutter newState, changed = myRS.checkState() if changed: myRS.activate(newState) myRS.timeout() return def minuteContainer(myMqtt, OM, myWR, relayDict, myLC, myRS): """ 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 all(i for i in myWR.WiFiResults) or anyChange: #repeat setting Shellys if any writing failed myWR.actual = TempControl(myMqtt.actual["T"],OM.parameters,myWR.actual,relayDict) myWR.switch(myWR.actual) myWR.writeLog(today, hour, minute, relayDict) elif 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) #elif int(minute)-2==0 or int(minute)-32==0: # #set relayes regularly, not to miss an event # myWR.switch(myWR.actual) # myWR.writeLog(today, hour, minute, relayDict, True) 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,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) myTime = float(hour) + float(minute)/60.0 myRS.control(OM, myTime, myLC.sunSetTime) 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"] = "OG3" relayDict["S02"] = "OG2" relayDict["S03"] = "OG5" relayDict["S04"] = "OG1" relayDict["S05"] = "OG4" relayDict["S06"] = "EG1" relayDict["S07"] = "EG2" relayDict["S08"] = "EG3" relayDict["S09"] = "EG4" relayDict["S10"] = "none" relayDict["LC1"] = "LC1" with open("./ConfDir/relayDict.json", 'w') as outfile: json.dump(relayDict, outfile) global secCount secCount= secCount+1 #call itself to loop forever, each 1 second threading.Timer(1, mainLoop).start() secondContainer(myMqtt, OM, myWR, relayDict, myLC, myRS) if secCount >= 60: # each 60 sec secCount = 0 minuteContainer(myMqtt, OM, myWR, relayDict, myLC, myRS) 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 logDict["LC1"] = actuators['LC1'] names = sensors["T"].keys() for s in names: logDict[s] = {} fields = [] #fields.append("date") #0 #fields.append("time") #1 fields.append("T") #0 fields.append("setpoint") #1 fields.append("relay") #2 fields.append("phi") #3 fields.append("p") #4 fields.append("state") #5 for s in names: for i,f in enumerate(fields): #if i>1 and i<5: if i == 2: try: logDict[s][f] = actuators[relayDict[s]] except: logDict[s][f] = -1 elif i == 1: logDict[s][f] = parameters[s] elif i == 5: try: logDict[s][f] = sensState[s] except: continue else: logDict[s][f] = sensors[f][s] with open(file, 'w') as outfile: json.dump(logDict, outfile) """ main programm, execute mainLoop() cyclically """ mainLoop()
python
php
Der gesamte Sourcecode darf gemäß GNU General Public License weiterverbreitet werden.