Hamburger Hamburger

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

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

php

1/HV_colorMap.php
2/HV_Admin_Login.php
3/HV_readOperationState.php
4/HV_setParameters.php
5/HV_config.php
6/EM_handleJSON.php
7/index.php
8/readFilenames.php
9/HV_restart.php
10/HV_moveGate.php
11/HV_showLog.php
12/HV_RollerShutter.php
13/EM_editParameter.php
14/HV_serviceLog.php
15/HV_H2Olevel.php
16/HV_TempCal.php
17/HV_Fronius.php
18/EM_plot.php
19/readNamedData.php
20/HV_composeH2Oplot.php
21/HVdoc.php
22/HV_showWeatherForecast.php
23/HV_showHouse.php

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