Dr. Arne JachensDr. Arne Jachens

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

1EnergyManager.py
2HvcControl.py
3HvcHCSR04ultrasonic.py
4HvcLightControl.py
5HvcMain.py
6HvcMotorDriver.py
7HvcMqtt.py
8HvcOneWire.py
9HvcOperationMode.py
10HvcRaw2phys.py
11HvcReadSPI.py
12HvcSendI2C.py
13HvcSetGPIO.py
14HvcTables.py
15HvcWeather.py
16HvcWifiRelay.py
17makeDoc.py

Der gesamte Sourcecode darf gemäß GNU General Public License weiterverbreitet werden.