Die coding-Zeile ist überflüssig, da Python3 defaultmäßig utf8 erwartet.
`as` bei `import` ist zum umbenennen da, GPIO wird aber gar nicht umbenannt.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 2 und mal 4.
Warnungen sind dazu da, dass man sie behebt, nicht dass man sie ignoriert.
Dazu muß aber auch cleanup verlässlich aufgerufen werden, nicht nur bei Ctrl+C.
Variablennamen schreibt man komplett klein, Konstanten dagegen KOMPLETT GROSS.
Das erste `timestamp` wird gar nicht benutzt.
Dateien öffnet man innerhalb des with-Statements.
Temperaturen sind Zahlen, keine Strings, da funktionieren die Vergleiche nicht.
Funktionen definiert man nicht innerhalb von while-Schleifen.
Und vergiss gleich wieder, dass es global überhaupt gibt, es funktioniert sowieso nicht, wie Du es benutzt.
`readline` mit einem Parameter ist eigentlich nie sinnvoll. Und schon wieder kein robustes Lesen von Temperaturen.
Man stückelt keine Strings per + zusammen, sondern benutzt Formatstrings.
Um mit einem Callback zu kommunizieren braucht man eine Queue.
Code: Alles auswählen
#!/usr/bin/python3
import time
import datetime
from functools import partial
from queue import Queue
from RPi import GPIO
import BlynkLib
BLYNK_AUTH = 'XY'
LUEFTER_PIN = 17
FAKTOR = 20
REGEL_INTERVAL = 10
LOGFILENAME = "/media/pi/USB_32GB/Raspi_101_Logs/PWMLuefter.csv"
ARCHIVE_LOGFILENAME = "/media/pi/USB_32GB/Archiv/PWMLuefter2021.csv"
def read_temperature_slave():
# Umgebungstemp Raspi -Technikfach Temp Sensor auslesen
with open('/sys/bus/w1/devices/28-000005bbd5b3/w1_slave') as data:
_, t, temperature = data.read().rpartition('t=')
if not t:
return float('nan')
return float(temperature) / 1000
def read_temperature_cpu1():
with open("/sys/class/thermal/thermal_zone0/temp") as data:
return float(data.read()) / 1000
def read_temperature_cpu2():
with open('/home/pi/Termo_Sensoren/CPUtempRPi2.txt') as data:
return float(data.read()) # warum hier kein / 1000?
def slider(queue, value):
queue.put(float(value[0]))
def main():
try:
queue = Queue()
blynk = BlynkLib.Blynk(BLYNK_AUTH, server='192.168.10.102', port=8080, heartbeat=30)
blynk.on('V39', partial(slider, queue))
GPIO.setmode(GPIO.BCM) # BCM-Bezeichnung der Pins verwenden
GPIO.setup(LUEFTER_PIN, GPIO.OUT) # GPIO 17 auf Ausgang setzen
# PWM einschalten
pwm = GPIO.PWM(LUEFTER_PIN, 250); # soll ?? 25kHz Frequenz
pwm.start(10)
print('Start mit 10% ')
time.sleep(3.0)
rpmf = 1
while True:
now = datetime.datetime.now()
cpu1_temperature = read_temperature_cpu1()
cpu2_temperature = read_temperature_cpu2()
slave_temperature = read_temperature_slave()
max_temperature = max(cpu1_temperature, cpu2_temperature)
cpu = "RPi1" if cpu1_temperature > cpu2_temperature else "RPi2"
while not queue.empty():
rpmf = queue.get()
delta = max_temperature - slave_temperature
rpm = delta + FAKTOR + rpmf
log_line = f"{now:%Y-%m-%d %H:%M:%S}; CPU 1: {cpu1_temperature:.2f}°C; CPU 2: {cpu2_temperature:.2f}°C; {rpm}% DutyCycle; Technikfach: {slave_temperature:.2f}°C; Delta: {delta:.2f}°C; {cpu}\n"
with open(LOGFILENAME, "a") as output:
output.write(log_line)
with open(ARCHIVE_LOGFILENAME, "a") as output:
output.write(log_line)
pwm.ChangeDutyCycle(100 if max_temperature >= 65 else rpm)
blynk.run()
time.sleep(REGEL_INTERVAL)
except KeyboardInterrupt:
# Abbruch durch Taste Strg-C
pass
finally:
pwm.stop()
GPIO.cleanup()
if __name__ == '__main__':
main()