def logSensorZuweisung(self): dateiname = DATEINAME_SENSOR_ZUWEISUNG dateiordner = ORDNER_SENSOR_ZUWEISUNG zuweisungsListe = Communicator.fileReader(dateiName=dateiname, ordner=dateiordner) sensorListe = Communicator.loadObjectFromServer( name=SERVER_OBJEKT_SENSORLISTE, expectedDatatype=SensorListe.SensorListe, create=True ) # Jeden vorhandenen Sensor ggf. in die Liste aufnehmen, die Sensoren, die bereits in der Liste sind, koennen da bleiben flagSensorVorhanden = ( None ) # Flag wird benoetigt, damit nicht gespeichert wird, falls sich garnichts veraendert hat for sensor in sensorListe: if sensor.getName() is not None and sensor.getName() is not str(None): flagSensorVorhanden = False # initialisierung # Parsen der vorhandenen Datei nach der SensorId und ggf. ueberschreiben for lineNumber in range(len(zuweisungsListe)): if ( sensor.getID() in zuweisungsListe[lineNumber] ): # Falls die SensorID bereits vorhanden ist, soll sie umgeschrieben werden zuweisungsListe[lineNumber] = sensor.getName() + TRENNZEICHEN_SENSOR_ZUWEISUNG + sensor.getID() flagSensorVorhanden = True break # herausspringen, damit der rest nicht ueberprueft werden muss # Falls der Sensor noch nicht in der Liste ist: Sensor hinzufuegen if not flagSensorVorhanden: # Falls der sensor in der obrigen Schleife noc nicht gefunden wurde zuweisungsListe.append(sensor.getName() + TRENNZEICHEN_SENSOR_ZUWEISUNG + sensor.getID()) flagSensorVorhanden = True # Abspeichern der neuen zuweisungsliste if flagSensorVorhanden is True: # True wird nur dann gesetzt, falls sich etwas geaendert hat Communicator.fileSaver(zuweisungsListe, dateiname=dateiname, ordner=dateiordner)
def getNewSensorName(self, sensor): """Die Methode fuer einen neuen Sensor muss auf dem server sein, da man hier den Ueberblick ueber alle aktuellen informationen haben sollte""" # Erstmal schauen ob der Sensor in der idZuweisungsdatei gelistet ist: try: zuweisungsListe = Communicator.fileReader( dateiName=DATEINAME_SENSOR_ZUWEISUNG, ordner=ORDNER_SENSOR_ZUWEISUNG, createIfNotExisting=True ) for line in zuweisungsListe: if sensor.getID() in line: line = line.replace(sensor.getID(), "") line = line.replace(" ", "") line = line.replace(TRENNZEICHEN_SENSOR_ZUWEISUNG, "") line = line.replace("\t", "") line = line.replace("\n", "") line = line.replace("\r", "") return line except IOError: print("Keine Zuweisungsdatei vorhanden") # Manuell den Sensor mithilfe der gegebenen Namensliste uaswaehlen ID = {} for sensorname in SENSORLISTE: ID[str(SENSORLISTE.index(sensorname))] = sensorname for key in sorted(ID): print("{key:5s}: {name}".format(key=str(key), name=ID[key])) eingbabe = None while eingbabe not in ID: eingbabe = raw_input("Auswahl:") return ID[eingbabe]
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])
def main(argv): Aufstellort = "" # initialisierung damit meldung "variable might be unreferenced" nicht angezeigt wird in Hauptschleife while True: try: Aufstellort = BEZEICHNUNG_KELLER #Wichtig fuer GPIO Zuweisung VorlaufMischer = Mischer(Aufstellort, versorgungsPuffer=BEZEICHNUNG_PUFFER+PUFFERNAME_HEIZUNG) HeizungsPumpe = Pumpe(BEZEICHNUNG_HEIZUNGSPUMPE) VorlaufMischer.Aktualisieren() print ("\nInitialsdaten:") print(VorlaufMischer) break except Exception as e: Communicator.SchreibeFehler(e.message, 'main@Mischer Initialisierung') time.sleep(20) # Hauptschleife try: while True: try: VorlaufMischer.Aktualisieren() HeizungsPumpe.PinsAktualisieren() VorlaufMischer.Kalkulieren() VorlaufMischer.PrintParameterWerte() #Daten ausgeben Communicator.storeObjectToServer(name=VorlaufMischer.getName(),instanz=VorlaufMischer) VorlaufMischer.StarteRegelZyklus() if VorlaufMischer.Heizbetrieb: HeizungsPumpe.Ein() else: HeizungsPumpe.Aus() except Exception as e: Communicator.SchreibeFehler(e,"In Mischer" + Aufstellort + ".py ausgeloest") time.sleep(20) except KeyboardInterrupt: GPIO.cleanup() exit()
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()
def writeTemperatures(self): # print ('Logging temperatures...') self.connect() if self.db.open and self.connected: sensorList = Communicator.getSensorList() sensornames = "" sensorvalues = "" for sensor in sensorList: sensornames += sensor.getName() + "," sensorvalues += str(sensor.getTemperatur()) + "," sensornames = sensornames[:-1] sensorvalues = sensorvalues[:-1] self._tableInsert(TABLENAME_TEMPERATUREN, sensornames, sensorvalues, datatype="VARCHAR", create=True) else: print ("Connection Error")
def run(self): self.Parameter = Communicator.GetParameter() try: self.Intervall = self.Parameter["ProtokollierungsIntervall"] if self.Intervall < 0.01: self.Intervall = 0.01 except KeyError: print ("KeyError in Warnung --- ProtokollierungsIntervall in Parameterdatei nicht vorhanden") self.Intervall = KONTROLL_INTERVALL WarnText="" try: WarnDatei = Communicator.fileReader(dateiName=DATEINAME_ERROR_LOG, createIfNotExisting=False, errorMsg = False) #vorhandene fehler einlesen for line in WarnDatei: WarnText+=line #Email mit exception lines erstellen self.Stoerung = True if WarnText == "": os.remove(DATEINAME_ERROR_LOG) self.Stoerung = False # except IOError: self.Stoerung = False # todo: test ob alle programmteile Laufen #KOmmunikationsprozess der von jedem programmteil aufgerufen wird und in datei geschrieben wird #test ob die Dateien aktualisiert werden if self.Stoerung: print ("Es sind Fehler vorhanden!!!") try: self.Intervall = self.Parameter["ProtokollierungsIntervallBeiFehler"]*3600 except KeyError: self.Intervall = KONTROLL_INTERVALL_FEHLER #3 Stunden self.Lampe.Ein() #Alarmlampe an #print WarnText try: if self.Parameter["MailsAktiviert"] == "True": os.system ("sudo python Mailsoftware.py " + "\"\"\"" + WarnText + "\"\"\"") #eMail versenden os.remove(DATEINAME_ERROR_LOG) except KeyError: print ("KeyError in Watchdog: Parameter[\"MailsAktiviert\"] nicht vorhanden") os.system ("sudo python Mailsoftware.py " + "\"\"\"" + WarnText + "\"\"\"") #eMail versenden os.remove(DATEINAME_ERROR_LOG) else: print ("Keine Fehler vorhanden") self.ProtokolliereDaten() time.sleep(self.Intervall)
def ProtokolliereDaten(self): sensorList = Communicator.getSensorList() self.Parameter = Communicator.GetParameter() try: MinLogZeit = self.Parameter["MinProtokollierteZeitspanne"] if MinLogZeit < 0.1 : MinLogZeit = 0.1 except KeyError: print ("In ProtokolliereDaten() Parameter[\"MinProtokollierteZeitspanne\"] ist nicht vorhanden") MinLogZeit = 20 #stunden Daten = ["SensornameZuTemperatur: " + str(sensorList) + "\n", "Parameter: " + str(self.Parameter) + "\n"] Zeilen = len(Daten)+1#Zeitstempel wird in Log() hinzugefügt MaxZeilen = (MinLogZeit*3600)/(self.Intervall/Zeilen) print ("Protokollierte Zeitspanne: %6.2f Stunden" %MinLogZeit) if self.Intervall < 3600: print ("ProtokollierungsIntervall: %6.2f Sekunden" %self.Intervall) else: print ("ProtokollierungsIntervall: %6.2f Stunden" %(self.Intervall/3600)) print ("Geschaetzte Protokollgroeße: %6.3f MB" %((float(MaxZeilen)*0.173)/1000)) Communicator.Log (Daten,MaxZeilen=MaxZeilen) # Daten enthält 6 Zeilen
def SetHeizbetrieb(self, value=None): """Setzt den Heizbetrieb-Flag im Hinblick auf Eingabeparameter und Umgebungsvariablen des Mischers""" if value is not None: if self.Heizbetrieb is True and value is False: # Falls bisher Heizbetrieb war -> Mischer komplett schließen self.KomplettKalt() self.Heizbetrieb = bool(value) else: self.Heizbetrieb = True # Heizbetrieb abschalten, wenn die benötigte Temperatur nicht geliefert werden kann if self.versorgungsPuffer: # Teste ob einer zugwiesen wurde # Ermittel die maximale lieferbare Temperatur if self.TemperaturAusgangSoll > Communicator.loadObjectFromServer(name=self.versorgungsPuffer).getMaxTemperatur(): self.SetHeizbetrieb(False) return if self.TemperaturRaumSoll is not None and self.TemperaturAussen is not None: # Heizbetrieb abschalten, wenns draussen zu warm ist self.DeltaTStart = self.Parameter[PARAMETER_DELTA_TEMPERATUR_INNEN_AUSSEN_MIN] DeltaT = self.TemperaturRaumSoll - self.TemperaturAussen if DeltaT <= self.DeltaTStart: self.SetHeizbetrieb(False) return