def __init__(self): # todo: Befehlsliste erst KOMPLETT generieren, dann abspeichern ###INITIALISIERUNG### self.parameter = Communicator.GetParameter() self.logging = False self.dbManger = DatenbankManager() # Initialisiere Pumpen self.PumpeHeizraum = Pumpe(BEZEICHNUNG_PUMPE_HEIZRAUM) self.PumpeKeller = Pumpe(BEZEICHNUNG_PUMPE_KELLER) # Zustand Laden zustaende = Communicator.GetBefehle() if zustaende is not None: for pumpe in zustaende: if pumpe == self.PumpeHeizraum.Bezeichnung: if zustaende[pumpe]: self.PumpeHeizraum.Ein() else: self.PumpeHeizraum.Aus() #Initialisieren PufferReserve self.PufferReserve = Puffer(Volumen=VOLUMEN_RESERVE, Heizkreis=PUFFERNAME_HEIZRAUM) # Initialisieren PufferHeizung self.PufferHeizung = Puffer(Volumen=VOLUMEN_HEIZUNG, Heizkreis=PUFFERNAME_HEIZUNG) # Puffer Nr 2 im Keller # Initialisiere PufferHygiene self.PufferHygiene = Puffer(Volumen=VOLUMEN_HYGIENE, Heizkreis=PUFFERNAME_HYGIENE) # Verknuepfen PufferReserve self.PufferReserve.setVersorgtePuffer(self.PufferHeizung) self.PufferReserve.setVersorgtePuffer(self.PufferHygiene) self.PufferReserve.setEntladePumpe(self.PumpeHeizraum) # Verknuepfen PufferHeizung self.PufferHeizung.setEntladePumpe(self.PumpeKeller) self.PufferHeizung.setBeladePumpe(self.PumpeHeizraum) self.PufferHeizung.setVersorgungsPuffer(self.PufferReserve) self.PufferHeizung.setVersorgtePuffer(self.PufferHygiene) self.PufferHeizung.setMischer(MischerName=BEZEICHNUNG_MISCHER+BEZEICHNUNG_KELLER) # Verknuepfen PufferHygiene self.PufferHygiene.setBeladePumpe(self.PumpeKeller) self.PufferHygiene.setVersorgungsPuffer(self.PufferReserve) self.PufferHygiene.setVersorgungsPuffer(self.PufferHeizung)
class Manager: def __init__(self): # todo: Befehlsliste erst KOMPLETT generieren, dann abspeichern ###INITIALISIERUNG### self.parameter = Communicator.GetParameter() self.logging = False self.dbManger = DatenbankManager() # Initialisiere Pumpen self.PumpeHeizraum = Pumpe(BEZEICHNUNG_PUMPE_HEIZRAUM) self.PumpeKeller = Pumpe(BEZEICHNUNG_PUMPE_KELLER) # Zustand Laden zustaende = Communicator.GetBefehle() if zustaende is not None: for pumpe in zustaende: if pumpe == self.PumpeHeizraum.Bezeichnung: if zustaende[pumpe]: self.PumpeHeizraum.Ein() else: self.PumpeHeizraum.Aus() #Initialisieren PufferReserve self.PufferReserve = Puffer(Volumen=VOLUMEN_RESERVE, Heizkreis=PUFFERNAME_HEIZRAUM) # Initialisieren PufferHeizung self.PufferHeizung = Puffer(Volumen=VOLUMEN_HEIZUNG, Heizkreis=PUFFERNAME_HEIZUNG) # Puffer Nr 2 im Keller # Initialisiere PufferHygiene self.PufferHygiene = Puffer(Volumen=VOLUMEN_HYGIENE, Heizkreis=PUFFERNAME_HYGIENE) # Verknuepfen PufferReserve self.PufferReserve.setVersorgtePuffer(self.PufferHeizung) self.PufferReserve.setVersorgtePuffer(self.PufferHygiene) self.PufferReserve.setEntladePumpe(self.PumpeHeizraum) # Verknuepfen PufferHeizung self.PufferHeizung.setEntladePumpe(self.PumpeKeller) self.PufferHeizung.setBeladePumpe(self.PumpeHeizraum) self.PufferHeizung.setVersorgungsPuffer(self.PufferReserve) self.PufferHeizung.setVersorgtePuffer(self.PufferHygiene) self.PufferHeizung.setMischer(MischerName=BEZEICHNUNG_MISCHER+BEZEICHNUNG_KELLER) # Verknuepfen PufferHygiene self.PufferHygiene.setBeladePumpe(self.PumpeKeller) self.PufferHygiene.setVersorgungsPuffer(self.PufferReserve) self.PufferHygiene.setVersorgungsPuffer(self.PufferHeizung) def aktualisiereAlleLadeStati(self): self.PufferHygiene.aktualisiereLadeStatus() self.PufferReserve.aktualisiereLadeStatus() self.PufferHeizung.aktualisiereLadeStatus() def aktualisiereAlleLadungen(self): self.PufferHygiene.getLadung() self.PufferReserve.getLadung() self.PufferHeizung.getLadung() def aktualisiereAlleSensorwerte(self): self.PufferHygiene.PufferSensors.refreshAllSensorTemperatures() self.PufferReserve.PufferSensors.refreshAllSensorTemperatures() self.PufferHeizung.PufferSensors.refreshAllSensorTemperatures() def aktualisiereAlleParameter(self): self.parameter = Communicator.GetParameter() try: self.logging = eval(self.parameter[PARAMETER_LOGGING_PUFFER]) except KeyError: Communicator.SchreibeFehler('%s Ersatzparameter uebernommen' %PARAMETER_LOGGING_PUFFER, 'aktualisiereAlleParameter in PufferSteuerung') self.logging = ERSATZPARAMETER_LOGGING_PUFFER self.PufferHygiene.Aktualisieren() self.PufferReserve.Aktualisieren() self.PufferHeizung.Aktualisieren() try: self.PufferHeizung.MinimaleTemperatur = Communicator.GetSensorTemperatur(BEZEICHNUNG_SENSOR+BEZEICHNUNG_MISCHER+BEZEICHNUNG_KELLER) except Exception as e: Communicator.SchreibeFehler(e,'aktualisiereAlleParameter@Manager') pass def controlReserve(self): """Steuert großen ReservePuffer""" heizungMinTemperatur = self.PufferHeizung.getMinTemperatur() if heizungMinTemperatur is None: return temperaturAusgangMin = self.PufferHeizung.getMinTemperatur() + ERSATZPARAMETER_TEMPERATUR_PUMPVERLUSTE + ERSATZPARAMETER_TEMPERATURDIFFERENZ_MIN_PUMPEN # Fall 1: Puffer Voll if self.PufferReserve.Voll: #ohne Gnade entleeren, falls Puffer Voll self.PufferReserve.EntladepumpeEin() # Fall 2: Puffer Leer elif self.PufferReserve.Leer: #ohne Gnade nicht mehr entleeren, falls Puffer leer self.PufferReserve.EntladepumpeAus() # Fall 3: Ausgangstemperatur zu niedrig zum Laden if self.PufferReserve.getMaxTemperatur() <= temperaturAusgangMin: # Pumpe ausschalten, falls Temperaturniveau zu niedrig self.PufferReserve.EntladepumpeAus() # Fall 4: Laden, da Versorger gerade auch geladen wird: nicht vorhanden # kein Versorger vorhanden def controlHeizung(self): """Steuert den Heizungspuffer""" # Hinweis: beim Versorgungspuffer Pufferreserve kommen durch die lange Leitung noch Pumpverluste hinzu heizungMinTemperatur = self.PufferHeizung.getMinTemperatur() hygieneMinTemperatur = self.PufferHygiene.getMinTemperatur() if heizungMinTemperatur is None or hygieneMinTemperatur is None: return temperaturEingangMin = heizungMinTemperatur + ERSATZPARAMETER_TEMPERATUR_PUMPVERLUSTE + ERSATZPARAMETER_TEMPERATURDIFFERENZ_MIN_PUMPEN volumenEingang = self.PufferReserve.VolumenUeberTemperatur(temperaturEingangMin) try: HeizkreisMischer = Communicator.loadObjectFromServer(name=BEZEICHNUNG_MISCHER + BEZEICHNUNG_KELLER) if HeizkreisMischer is not None: temperaturAusgangMin = HeizkreisMischer.TemperaturAusgangSoll # Der Heizungspuffer muss mindestens so warm sein wie die Solltemperatur vom Mischer else: temperaturAusgangMin = hygieneMinTemperatur + ERSATZPARAMETER_TEMPERATURDIFFERENZ_MIN_PUMPEN except Exception as e: Communicator.SchreibeFehler(e, 'controlHeizung@PufferSteuerung') temperaturAusgangMin = hygieneMinTemperatur + ERSATZPARAMETER_TEMPERATURDIFFERENZ_MIN_PUMPEN # Fall 1: HeizungsPuffer Voll if self.PufferHeizung.Voll: if self.PufferReserve.Voll: # weiterlaufen lassen, falls auch reserve voll #Beladepumpe: self.PufferHeizung.BeladepumpeEin() #Entladepumpe: self.PufferHeizung.EntladepumpeEin() else: # Anhalten falls selber voll und reserve nicht voll self.PufferHeizung.BeladepumpeAus() # Fall 2: HeizungsPuffer Leer elif self.PufferHeizung.Leer: #Beladepumpe try: mindestvolumen = Communicator.GetParameter(parameter=PARAMETER_MINDESTVOLUMEN_PUMPEN) if volumenEingang > mindestvolumen: self.PufferHeizung.BeladepumpeEin() else: Communicator.SchreibeFehler('PufferHeizung laedt nicht', '\nVorhandenes Volumen: ' + volumenEingang + '\nErforderlichesVolumen: ' + mindestvolumen) except KeyError: if volumenEingang > ERSATZPARAMETER_MINDESTVOLUMEN_PUMPEN: self.PufferHeizung.BeladepumpeEin() #Entladepumpe self.PufferHeizung.EntladepumpeAus() # Fall 3: Ausgangstemperatur zu niedrig zum Laden if self.PufferHeizung.getMaxTemperatur() <= temperaturAusgangMin: # Pumpe ausschalten, falls Temperaturniveau zu niedrig #Entladepumpe, self.PufferHeizung.EntladepumpeAus() # Fall 4: Laden, da Versorger gerade auch geladen wird: nicht vorhanden # Keine Ladepumpe für Reserve vorhanden def controlHygiene(self): """Steuert den Hygienespeicher""" heizungMinTemperatur = self.PufferHeizung.getMinTemperatur() hygieneMinTemperatur = self.PufferHygiene.getMinTemperatur() if heizungMinTemperatur is None or hygieneMinTemperatur is None: return temperaturEingangMin = self.PufferHygiene.getMinTemperatur() + ERSATZPARAMETER_TEMPERATURDIFFERENZ_MIN_PUMPEN volumenEingang = self.PufferHeizung.VolumenUeberTemperatur(temperaturEingangMin) # Fall 1: HygienePuffer Voll if self.PufferHygiene.Voll: if self.PufferHeizung.Voll and self.PufferReserve.Voll: # weiterlaufen lassen, falls auch reserve und heizung voll #Beladepumpe: self.PufferHygiene.BeladepumpeEin() else: # Anhalten falls selber voll und heizung nicht voll self.PufferHygiene.BeladepumpeAus() # Fall 2: HygienePuffer Leer elif self.PufferHygiene.Leer: if volumenEingang > 0: self.PufferHygiene.BeladepumpeEin() # Fall 3: Temperaturniveau zu niedrig zum Laden # Ist nicht zuständig für irgendeine Versorgung # Fall 4: Laden, da Versorger gerade auch geladen wird: if self.PufferHeizung.Pumpe_Fuellen.IstAktiv and self.PufferHeizung.getMaxTemperatur() > temperaturEingangMin: self.PufferHygiene.BeladepumpeEin() def Managemenent(self): ### Kontrollprozedur durchfuehren### ### evtl. Abhängigkeitsbaum hierzu aufzeichnen -> rel. kompliziert ### self.aktualisiereAlleParameter() self.aktualisiereAlleLadungen() self.aktualisiereAlleSensorwerte() self.aktualisiereAlleLadeStati() self.controlReserve() self.aktualisiereAlleLadeStati() self.controlHeizung() self.aktualisiereAlleLadeStati() self.controlHygiene() self.showStatus() def showStatus(self): print ( '%s' %'-'*55) print (self.PufferReserve) print (self.PufferHeizung) print (self.PufferHygiene) def datalogger (self): """ Loggt die aktuellen Pufferdaten in die verschiedensten Ecken des Programms und der Raspberrys 1. Auf die SQL Datenbank 2. Auf den Datenserver """ if self.logging: pufferManagerMembers = vars(self) for puffer in pufferManagerMembers.keys(): if isinstance(pufferManagerMembers[puffer], Puffer): self.dbManger.logObject(puffer,pufferManagerMembers[puffer]) pufferManagerMembers = vars(self) for puffer in pufferManagerMembers.keys(): if pufferManagerMembers[puffer].__class__.__name__ == Puffer.__name__: Communicator.storeObjectToServer(name=pufferManagerMembers[puffer].Bezeichnung, instanz=pufferManagerMembers[puffer])