Hilfe bei Endlosschleife

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Jens76
User
Beiträge: 1
Registriert: Sonntag 19. Januar 2020, 20:27

[/size]Hallo in die Runde.
Ich bin totaler Anfänger was Python betrifft und benötige etwas Hilfe.
Ich schreibe gerade ein Script mit dem ich meine defekte Heizungssteuerung ersetzen will.
Leider bekomme ich es nicht gebacken dass Script am "Leben zu erhalten".
Ich habe schon einiges über while und for schleifen gelesen, konnte aber nicht erfolgreich umsetzen.
Folgendes Script soll immer wieder ausgeführt werden:
Leider werden hier alle Zeilen ohne Einrückung übernommen

#!/usr/bin/pyton
# coding=utf-8

import glob, os, sys, time

import RPi.GPIO as gp

pfad = "/sys/bus/w1/devices/"
x1 = glob.glob(pfad + "28-01192104e8f4")[0]#OELOFENtemperatur
x2 = x1 + "/w1_slave"
y1 = glob.glob(pfad + "28-03089794262f")[0]#ABGAStemperatur
y2 = y1 + "/w1_slave"
z1 = glob.glob(pfad + "28-0119210f5f25")[0]#LADDOMATtemperatur
z2 = z1 + "/w1_slave"

#=============OELOFENTEMPERATUR==================
def OELOFEN_lesen():
OELOFEN = open(x2, "r")
zeilen = OELOFEN.readlines()
OELOFEN.close()
return zeilen
def OELOFENTEMPERATUR():
OELOFEN = OELOFEN_lesen()
while OELOFEN[0].strip()[-3:] != 'YES':
time.sleep(0.2)
OELOFEN = OELOFEN_lesen()
equals_pos = OELOFEN[1].find('t=')
if equals_pos != -1:
temp_string = OELOFEN[1][equals_pos+2:]
temp_a = float(temp_string) / 1000.0
return temp_a
#=============ABGASTEMPERATUR==================
def ABGAS_lesen():
ABGAS = open(y2, "r")
zeilen = ABGAS.readlines()
ABGAS.close()
return zeilen
def ABGASTEMPERATUR():
ABGAS = ABGAS_lesen()
while ABGAS[0].strip()[-3:] != 'YES':
time.sleep(0.2)
ABGAS = ABGAS_lesen()
equals_pos = ABGAS[1].find('t=')
if equals_pos != -1:
temp_string = ABGAS[1][equals_pos+2:]
temp_b = float(temp_string) / 1000.0
return temp_b
#=============LADDOMATTEMPERATUR==================
def LADDOMAT_lesen():
LADDOMAT = open(z2, "r")
zeilen = LADDOMAT.readlines()
LADDOMAT.close()
return zeilen
def LADDOMATTEMPERATUR():
LADDOMAT = LADDOMAT_lesen()
while LADDOMAT[0].strip()[-3:] != 'YES':
time.sleep(0.2)
LADDOMAT = LADDOMAT_lesen()
equals_pos = LADDOMAT[1].find('t=')
if equals_pos != -1:
temp_string = LADDOMAT[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
return temp_c
#=========================VARIABLEN=FESTLEGEN====
x = (OELOFENTEMPERATUR()) # 28-01192104e8f4
print ("Ölofentemperatur", x)
y = (ABGASTEMPERATUR()) #28-03089794262f
print ("Abgastemperatur", y)
z = (LADDOMATTEMPERATUR()) #28-0119210f5f25
print ("Laddomattemperatur", z)
#===========FESTDEFINIERTE=WERTE=============================================
W1 = 68.00 # Laddomat aus
W2 = 70.00 # Laddomat im Betrieb
W3 = 40.00 # Ofen (Lüfter) aus
W4 = 42.00 # Ofen (Lüfter) in Betrieb
W5 = 78.00 # Abgas OK - Ofen (Lüfter) in Betrieb
W6 = 80.00 # Abgas zu Heiß - Beginn Drosselmodus
W7 = 38.00 # Heizungspumpe aus - Wasser zu kalt
W8 = 40.00 # Heizungspumpe im Betrieb

#=============GPIO=für=Relais=Steuerung===========================
gp.setmode(gp.BCM) # BCM Nummer verwenden
gp.setwarnings(False) # Warnmeldungen abschalten
gp.setup(18, gp.OUT) # Pin12 BCM Nummer 18
gp.setup(24, gp.OUT) # Pin18 BCM Nummer 24
gp.setup(25, gp.OUT) # Pin22 BCM Nummer 25
gp.setup(17, gp.OUT) # Pin11 BCM Nummer 17
#============IF=ELIF=ELSE==================================

#============HAUPTPUMPE=======ÖLOFENPUMPE=================

if x > W8:
gp.output(25, gp.LOW) #Relais 25 Ein, Pumpe ein
print("Hauptpumpe ist ein")
elif x < W7:
gp.output(25, gp.HIGH) #Relais 25 Aus, Pumpe aus
print("Hauptpumpe ist aus")
else:
print ("Falscher Übergabewert in ledSteuerung()")
#===================LADDOMAT=HOLZOFEN======================
if z < W1:
gp.output(18, gp.HIGH) #Relais 18 AN, Pumpe aus
print("Laddomat ist aus")
elif z > W2:
gp.output(18, gp.LOW) #Relais 18 AUS, Pumpe an
print("Laddomat ist an")
#=====================OFEN=(LÜFTER)=EIN/AUS================
if y < W3:
gp.output(24, gp.LOW) #Relais 24
print("Ofen (Lüfter) ist Ausgeschaltet")
elif y > W4:
gp.output(24, gp.HIGH) #Relais 24
print("Ofen (Lüfter) ist in Betrieb")
#============ABGAS=ZU HEIß=LÜFTER=DROSSELN================
if y > W6:
gp.output(17, gp.LOW) #Relais 17
print("Abgas zu heiß - Drosselmodus")
elif y < W5:
gp.output(17, gp.HIGH) #Relais 17
print("Abgas OK")


Im Einzeldurchlauf funktioniert es Perfekt,
schon einmal Danke im voraus

Jens76
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

GPIO als gp abzukürzen ist ungewöhnlich, mit anderen Worten: macht man nicht.
Warum benutzt Du `glob`, wo Du doch kein Pattern als Pfad benutzt?
x2,y2,z2 für Pfade sind ganz schlechte Namen, OELOFEN_TEMPERATUR_DATEINAME wäre viel besser. Pfade setzt man auch nicht mit + zusammen, sondern nimmt Path aus pathlib.

Dagegen sind die 6 Funktionen zum Lesen der Temperaturen fast trippelweise identisch. Funktionen werden auch, im Gegensatz zu Konstanten, klein geschrieben.
Also macht man daraus eine Funktion. Dateien werden mit dem with-Statement geöffnet. Die while-Schleife ist ziemlich schlecht. Weil entweder steht in der ersten Zeile immer YES oder nie.
`find` benutzt man eigentlich nicht, weil dann muß man ja mit Indizes herummachen, was eklig ist und man vermeidet, indem man split oder partition benutzt.
Eine Funktion sollte immer einen Rückgabewert haben, statt mal implizit None zurückzugegeben.
x, y und z sind wieder schlechte Variablennamen für Temperaturen

Die "fest definierten Werte" sollten auch bessere Namen als W123 haben. Warnungen sind dazu da, dass man sie behebt, nicht dass man sie ignoriert. Dazu muß aber auch verlässlich cleanup aufgerufen werden.

Code: Alles auswählen

#!/usr/bin/pyton3
import time
from pathlib import Path
import RPi.GPIO as gpio

DEVICE_PATH = Path("/sys/bus/w1/devices/")
OELOFEN_TEMPERATUR_DATEINAME = DEVICE_PATH / "28-01192104e8f4" / "w1_slave"
ABGAS_TEMPERATUR_DATEINAME = DEVICE_PATH / "28-03089794262f" / "w1_slave"
LADDOMAT_TEMPERATUR_DATEINAME = DEVICE_PATH / "28-0119210f5f25" / "w1_slave"

#===========FESTDEFINIERTE=WERTE=============================================
PIN_LADDOMAT = 18
TEMPERATUR_LADDOMAT_AN = 68.00 # Laddomat aus
TEMPERATUR_LADDOMAT_AUS = 70.00 # Laddomat im Betrieb


def temperatur_lesen(dateiname):
    while True:
        with dateiname.open() as lines:
            if next(lines).strip().endswith('YES'):
                line = next(lines)
                break
            time.sleep(0.2)
    _, _, temperature = line.partition('t=')
    if not temperature:
        return None
    return  float(temperature) / 1000

def main():
    gpio.setmode(gp.BCM) # BCM Nummer verwenden
    gpio.setup(PIN_LADDOMAT, gp.OUT)
    try:
        oelofen_temperatur = temperatur_lesen(OELOFEN_TEMPERATUR_DATEINAME)
        abgas_temperatur = temperatur_lesen(ABGASTEMPERATUR)
        laddomat_temperatur = temperatur_lesen(LADDOMAT_TEMPERATUR_DATEINAME)
        print ("Ölofentemperatur", oelofen_temperatur)
        print ("Abgastemperatur", abgas_temperatur)
        print ("Laddomattemperatur", laddomat_temperatur)
      
        if laddomat_temperatur < TEMPERATUR_LADDOMAT_AN:
            gpio.output(PIN_LADDOMAT, gp.HIGH) #Relais 18 AN, Pumpe aus
            print("Laddomat ist aus")
        elif laddomat_temperatur > TEMPERATUR_LADDOMAT_AUS:
            gpio.output(PIN_LADDOMAT, gp.LOW) #Relais 18 AUS, Pumpe an
            print("Laddomat ist an")
    finally:
      gpio.cleanup()

if __name__ == "__main__":
    main()
Wenn etwas immer wieder ausgeführt werden soll, dann brauchst Du eine Schleife.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und an dieser Stelle noch der obligatorische Hinweis: der PI ist ohne weitreichende Maßnahmen zur Stabilisierung und Verbesserung der Robustheit nicht wirklich geeignet für so eine Aufgabe. Wenn du nicht sehr genau weißt was du tust, und deine Wohnung weder zum Eisblock noch zum Vorhof der Hölle wird, wenn der abkackt - und er wird das tun - dann würde ich die Finger davon lassen.
Antworten