ich habe im Zuge eines Projektes die Aufgabe, auf einem Raspberry Pi mit Python eine smarte Temperatursteuerung mit Datenspeicherung und grafischer Darstellung zu erstellen.
Da ich kompletter Neuling bin und erst am 14.02 mit Python angefangen habe, sitze ich seit Tagen vor einem Problem.
Die Aufgabe: Mit einem Raspberry Pi, Temperaturfühler und einer RGB LED einen Serverschrank bewachen. Die LED soll je nach Temperatur grün, gelb und rot sein. Bei längerer Überhitzung soll eine E-Mail gesendet werden.
Für die Langzeitüberwachung sollen die Daten auch alle 15 Minuten gespeichert werden. Diese sollen beziehungsweise können später dann mit einem Programm geöffnet und ausgelesen werden.
Für die Temperatursteuerung habe ich getrennt zur grafischen Darstellung ein einzelnes Programm erstellt, welches so gerade so funktioniert.
Dieses sieht wie folgt aus: (Die Werte sind wegen Testzwecken verändert, bis ich fertig bin)
Code: Alles auswählen
import RPi.GPIO as GPIO
import time
import Adafruit_DHT
import smtplib, ssl
from datetime import datetime
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import sys
DHTSensor=Adafruit_DHT.DHT11
LED_ROT = 26
LED_GRUEN = 5
LED_BLAU = 6
TEMP = 23
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_ROT, GPIO.OUT, initial= GPIO.LOW)
GPIO.setup(LED_GRUEN, GPIO.OUT, initial= GPIO.LOW)
GPIO.setup(LED_BLAU, GPIO.OUT, initial= GPIO.LOW)
print ("Temperaturmessung startet [druecken Sie bitte STRG+C, um die Messungen zu beenden]")
while True:
try:
t1=time.strftime("%H:%M:%S")
t2=time.strftime("%H:%M")
t3=time.strftime("%H")
t4=time.strftime("%M")
d1=time.strftime("%d.%m.%y")
Luftfeuchte, Temperatur=Adafruit_DHT.read_retry(DHTSensor, TEMP)
print("_________________________________________________________")
if Temperatur is not None:
print("Temperatur={0:0.1f} Grad | rel. Luftfeuchtigkeit = {1:0.1f}%\n".format(Temperatur,Luftfeuchte))
print("Die Temperatur betraegt um {} am {} {} Grad".format(t1,d1,Temperatur))
if Temperatur <=25:#Alles Gruen
GPIO.output(LED_ROT,GPIO.LOW) #Rote LED bekommt 0V Spannung
GPIO.output(LED_GRUEN,GPIO.HIGH) #Gruene LED bekommt 3.3V Spannung
GPIO.output(LED_BLAU,GPIO.LOW) #Blaue LED bekommt 0V Spannung
if Temperatur >=26 <=27:#Gelbe (Vorsicht!)
GPIO.output(LED_ROT,GPIO.HIGH) #Rote LED bekommt 0V Spannung
GPIO.output(LED_GRUEN,GPIO.HIGH) #Gruene LED bekommt 3.3V Spannung
GPIO.output(LED_BLAU,GPIO.LOW) #Blaue LED bekommt 0V Spannung
if Temperatur >=28:#Rot (Warnung!)
GPIO.output(LED_ROT,GPIO.HIGH) #Rote LED bekommt 3.3V Spannung
GPIO.output(LED_GRUEN,GPIO.LOW) #Gruene LED bekommt 0V Spannung
GPIO.output(LED_BLAU,GPIO.LOW) #Blaue LED bekommt 0V Spannung
print("Achtung die Temperatur ist zu hoch! Messung wird gleich wiederholt!")
now=datetime.now()
if datetime.now().minute in {0,5,10,15,20,25,30,35,40,45,50,55}:
f= open("/home/pi/Desktop/Temperatur/Daten/Temperaturen am %s.txt" %(d1),"a+")
f.write("{},{}\n".format(t2,t4 , Temperatur))
f.close
print("Temperatur wurde gespeichert!\n")
time.sleep(59)
Luftfeuchte, Temperatur=Adafruit_DHT.read_retry(DHTSensor, TEMP)
if Temperatur >=28:
print("Temperatur immernoch zu hoch! Bei naechster zu hoher Messung wird eine E-Mail gesendet!")
now=datetime.now()
if datetime.now().minute in {0,5,10,15,20,25,30,35,40,45,50,55}:
f= open("/home/pi/Desktop/Temperatur/Daten/Temperaturen am %s.txt" %(d1),"a+")
f.write("{},{}\n".format(t2, Temperatur))
f.close
print("Temperatur wurde gespeichert!\n")
time.sleep(59)
Luftfeuchte, Temperatur=Adafruit_DHT.read_retry(DHTSensor, TEMP)
if Temperatur >=28:
try:
print("Temperatur zu hoch! E-Mail wird gesendet!\n")
sendEmail="___________"
empfEmail="___________"
port=465
smtp_server="smtp.gmail.com"
print("Login auf den Server und E-Mail wird jetzt gesendet!")
#msg=MIMEMultipart("alternative")
#msg["Subject"]="Die Temperatur des Serverschrankes ist zu hoch!"
#msg["From"]=sendEmail
#msg["To"]=empfEmail
emailText="Subject:Die Temperatur des Serverschrankes ist zu hoch!\n\nDie Temperatur betrug am {} um {} {}Grad".format(d1,t2,Temperatur)
#text=MIMEText(emailText)
#msg.attach(text)
context=ssl.create_default_context()
with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
server.login (sendEmail,"_________")
server.sendmail(sendEmail, empfEmail, emailText)
print("E-Mail wurde erfolgreich gesendet!\n")
server.quit()
for ino in range(0,6):
Luftfeuchte, Temperatur=Adafruit_DHT.read_retry(DHTSensor, TEMP)
print("_________________________________________________________")
if Temperatur is not None:
print("Temperatur={0:0.1f} Grad | rel. Luftfeuchtigkeit = {1:0.1f}%\n".format(Temperatur,Luftfeuchte))
print("Die Temperatur betraegt um {} am {} {} Grad".format(t1,d1,Temperatur))
if Temperatur <=25:#Alles Gruen
GPIO.output(LED_ROT,GPIO.LOW) #Rote LED bekommt 0V Spannung
GPIO.output(LED_GRUEN,GPIO.HIGH) #Gruene LED bekommt 3.3V Spannung
GPIO.output(LED_BLAU,GPIO.LOW) #Blaue LED bekommt 0V Spannung
if Temperatur >=26 <=27:#Gelbe (Vorsicht!)
GPIO.output(LED_ROT,GPIO.HIGH) #Rote LED bekommt 0V Spannung
GPIO.output(LED_GRUEN,GPIO.HIGH) #Gruene LED bekommt 3.3V Spannung
GPIO.output(LED_BLAU,GPIO.LOW) #Blaue LED bekommt 0V Spannung
if Temperatur >=28:#Rot (Warnung!)
GPIO.output(LED_ROT,GPIO.HIGH) #Rote LED bekommt 3.3V Spannung
GPIO.output(LED_GRUEN,GPIO.LOW) #Gruene LED bekommt 0V Spannung
GPIO.output(LED_BLAU,GPIO.LOW) #Blaue LED bekommt 0V Spannung
print("Temperatur immernoch zu hoch! E-Mail wird nicht gesendet!\nWurde in den letzten 5 Minuten schon gesendet")
now=datetime.now()
if datetime.now().minute in {0,5,10,15,20,25,30,35,40,45,50,55}:
f= open("/home/pi/Desktop/Temperatur/Daten/Temperaturen am %s.txt" %(d1),"a+")
f.write("{},{}\n".format(t2, Temperatur))
f.close
print("Temperatur wurde gespeichert!\n")
time.sleep(59)
except:
print("E-Mail konnte nicht gesendet werden! Bitte uebepruefen Sie die Internetverbindung!\n")
now=datetime.now()
if datetime.now().minute in {0,5,10,15,20,25,30,35,40,45,50,55}:
f= open("/home/pi/Desktop/Temperatur/Daten/Temperaturen am %s.txt" %(d1),"a+")
f.write("{},{}\n".format(t2, Temperatur))
f.close
print("Temperatur wurde gespeichert!\n")
else:
print("Fehler beim Auslesen - Bitte auf naechsten Versuch warten!")
time.sleep(59)
except KeyboardInterrupt:
GPIO.cleanup()
Und sieht in etwa so aus :
Meine Absicht ist aber, dass wenn man das Programm startet, dass es in eine sogenannte Tagesansicht startet, ich möchte, dass auf der X-Achse die Zeiten 00:00 - 23:00 angezeigt werden und auf der y-Achse 0 - 40 Grad. Das Programm soll lediglich, die verfügbaren Daten an den Stellen einfügen, zu dem die Zeit und die Temperatur passt. Die txt Datei sieht wie folgt aus und wird durch zwei "row.split(",")" Befehle zugewiesen:
Datei: Temperaturen am 18.02.20.txt
13:00,23.0
13:05,24.0
13:10,23.0
13:15,23.0
13:20,25.0
Später möchte ich noch historische Abfragen mit reinsetzen. dass man aus einem Monat pro Tag die höchste Temperatur auslesen kann, aber daran würde ich mich dann wieder selber setzen.
Ich hoffe, einer von euch hat evtl. eine Idee, da mir Google seit Tagen nicht mehr weiterhelfen kann.
Mit freundlichen Grüßen
JymaXx