Seite 2 von 2

Re: Datei lesen und schreiben, Inhalt für If Anweisung verwenden

Verfasst: Freitag 4. März 2022, 10:21
von imonbln
wusa hat geschrieben: Donnerstag 3. März 2022, 09:32 Jetzt will ich das ganze aber auf einen Cronjob umbauen und dazu benötige ich eine Datei um den Zustand zu speichern.
Ich denke, du hast dich da grundsätzlich verrannt.
Sicher einen Zustand in einer Datei zu speichern, ist etwas, das man können sollte und auch eine schöne Lektion im Umgang mit Zuständen in Dateien. Aber für eine Regelung ungeeignet. Sowas läuft immer Gefahr, dass durch ein Reset, ein anderes Programm oder was ganz anderes der Zustand in der Datei nicht mehr mit der Realität übereinstimmt.

Du solltest daher das Pythonskript so schrieben, dass es den aktuellen Zustand der PIN11 nicht aus einer Datei oder Variablen liest, sondern mit gpio.input direkt auslesen, was der Pin für einen Wert hat, das macht dein Programm zum einen robuster und zum anderen auch etwas einfacher.

Re: Datei lesen und schreiben, Inhalt für If Anweisung verwenden

Verfasst: Freitag 4. März 2022, 10:45
von wusa
__deets__ hat geschrieben: Freitag 4. März 2022, 10:10 Und in den Code gehört vor dem if das Print mit repr für beide Werte. Lüfter und Temperatur. Nur dann kannst du sehen, was da mit den Bedingungen passiert.
Ich habe jetzt folgenden Code:

Code: Alles auswählen

Netzwerkschrankfile = "netzwerkschrank.txt"
with open(Netzwerkschrankfile) as file:
        luefter = file.read().strip()
        
print(repr(luefter))
print(type(luefter))
print(repr(netzwerkschranktemp))
print(type(netzwerkschranktemp))


if luefter == "an" and netzwerkschranktemp < LOWER:
    print("aus")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("aus")
    gpio.output(11, gpio.HIGH)

if luefter == "aus" and netzwerkschranktemp > UPPER:
    print("an")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("an")
    gpio.output(11, gpio.LOW)

Zu deiner Frage noch, was dabei raus kommt:

Code: Alles auswählen

'an'
<class 'str'>

20.437
<class 'float'>

aus
Jetzt springt wird auch in die IF Anweisung gesprungen und es läuft eigentlich genauso, wie ich es mir vorgestellt hatte.
imonbln hat geschrieben: Freitag 4. März 2022, 10:21 Ich denke, du hast dich da grundsätzlich verrannt.
Ja das dachte ich kurzzeitig auch... Aber jetzt läuft es.
imonbln hat geschrieben: Freitag 4. März 2022, 10:21 Sicher einen Zustand in einer Datei zu speichern, ist etwas, das man können sollte und auch eine schöne Lektion im Umgang mit Zuständen in Dateien. Aber für eine Regelung ungeeignet. Sowas läuft immer Gefahr, dass durch ein Reset, ein anderes Programm oder was ganz anderes der Zustand in der Datei nicht mehr mit der Realität übereinstimmt.
Verstehe ich, aber ich weiß, dass kein anderes Programm je darauf zugreift.
Aber ich verstehe auch, dass es nicht die sauberste Lösung ist.
Ich werde das in nächster Zeit aber kontrollieren und sobald mir etwas auffällt, werde ich das auf jeden Fall nochmal versuchen umzubauen.
Einziges Problem sehe ich, wenn ich den PI Neustarte, dass ich keinen definierten Zustand habe, und ich dann mit dem Auslesen von dem Pin hängen bleibe.


Alles in Allem, vielen Dank für die Hilfe!

Re: Datei lesen und schreiben, Inhalt für If Anweisung verwenden

Verfasst: Freitag 4. März 2022, 11:11
von imonbln
wusa hat geschrieben: Freitag 4. März 2022, 10:45 Einziges Problem sehe ich, wenn ich den PI Neustarte, dass ich keinen definierten Zustand habe, und ich dann mit dem Auslesen von dem Pin hängen bleibe.
Die Befürchtung verstehe ich, ich würde das entweder mit dein oneshot Service beim Starten des Pi machen, bevor der Cronjob das erstmal läuft, oder ich würde versuchen das Programm idempotent zu schreiben, so das es die PINs bei jeden Start selbst Konfiguriert so wie sie erwartet werden.

Re: Datei lesen und schreiben, Inhalt für If Anweisung verwenden

Verfasst: Freitag 4. März 2022, 11:45
von Sirius3
Eingerückt wird immer mit 4 Leerzeichen pro Ebene.
Variablennamen und Funktionen schreibt man komplett klein.
Dateien öffnet man mit with. Zum try fehlt ein except.
Man benutzt keine magischen Zahlenwerte sondern Konstanten.
Benutze keine kryptischen Abkürzungen, wenn Du temperatur meinst, dann schreibe nicht temp.

Und Dein Problem mit dem undefinierten Zustand verstehe ich nicht, entweder ist der Pin 1 oder 0, da gibt es nichts undefiniertes.

Code: Alles auswählen

LUEFTER_PIN = 11

current_state = gpio.input(LUEFTER_PIN)
if current_state == gpio.LOW and netzwerkschrank_temperatur < LOWER:
    gpio.output(LUEFTER_PIN, gpio.HIGH)
elif current_state == gpio.HIGH and netzwerkschrank_temperatur > UPPER:
    gpio.output(LUEFTER_PIN, gpio.LOW)

Re: Datei lesen und schreiben, Inhalt für If Anweisung verwenden

Verfasst: Freitag 4. März 2022, 18:21
von imonbln
Der folgende Code ist ungetestet, sollte aber nach meinem Verständnis ohne dein komisches Statusfile auskommen und die Lüfter abhängig vom GPIO Status schalten können.

Code: Alles auswählen

import enum
import time
import RPi.GPIO as gpio


FAN_PIN = 11


@enum.unique
class FanState(enum.Enum):
    ON = gpio.HIGH
    OFF = gpio.LOW
    
    
def setupgpio():
    gpio.setmode(gpio.BCM)
    gpio.setwarnings(True)
    gpio.setup(FAN_PIN, gpio.OUT)
    
    
def controltemperature(lower: int = 21, upper: int = 23):
    cabinettemp = readsensor() # readsensor heißt bei dir sensorauslesen
    
    if gpio.input(FAN_PIN):
        if cabinettemp < lower:
            gpio.output(FAN_PIN, FanState.OFF.value)
    else:   
        if cabinettemp > upper:
            gpio.output(FAN_PIN, FanState.ON.value)
            

def main():
    setupgpio()
    while True:
        controltemperature()
        # Rechnen kann Python besser als ich, 60 * 15 ist verständlicher für
        # den Leser als 899 (warum eigentlich nicht 900,
        # dann sind die 15 min voll)
        time.sleep(60 * 15)


if __name__ == "__main__":
    main()

Sollte der Code funktionieren musst du nur das while True entfernen und fertig ist dein cronjob (time.sleep nicht vergessen)