Blynk Slider Funktion Variable

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Shabang-Zeile muß die erste Zeile in der Datei sein, die Leerzeile am Anfang ist ein Fehler.
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()
JSStefan
User
Beiträge: 18
Registriert: Donnerstag 22. April 2021, 19:45
Kontaktdaten:

Da bin jetzt erstmal Baff.... DANKE für die Nachhilfe....
Ich muss mir das jetzt alles mal im Detail ansehen um meine "Fehler / Deine Verbesserungen" zu erkennen. Sieht wesentlich aufgeräumter aus. Etliche der Begriffe die Du in den ersten Zeilen verwendest hab ich noch nie gelesen... da ist dann Google mein Freund :-)

Einfach stark zu lesen, wieviel einfacher man manche Sachen ausdrücken kann, wenn man weiss wie.

Bei meinen Versuchen bin ich schon froh wenn es funktioniert... aber auch bei Profis (falls Du einer bist) funktioniert nicht alles auf Anhieb :-) Ich versuche dem jetzt erstmal alleine auf die Schliche zu kommen.

Nochmals Danke
Stefan
Wer Was Wo... www.tvware.de
Antworten