Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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]
Exemplo n.º 3
0
    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])
Exemplo n.º 4
0
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()
Exemplo n.º 5
0
    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()
Exemplo n.º 6
0
 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")
Exemplo n.º 7
0
	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)
Exemplo n.º 8
0
	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
Exemplo n.º 9
0
    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