Seite 1 von 2

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

Verfasst: Donnerstag 3. März 2022, 09:32
von wusa
Hallo,

ich schaffe es leider nicht, den Inhalt einer Datei für meine IF Anweisung zu verwenden.

Ich habe momentan eine Skript, das immer in einer Schleife läuft, das funktioniert soweit wunderbar. Jetzt möchte ich aber die Schleife raus haben und das ganze über einen Cronjob laufen lassen.

Mein momentanes Skript sieht wie folgt aus. Ich schicke nur den relevanten Teil um den es geht. Wenn jemand den ganzen Zusammenhang wissen will, kann ich gerne auch den ganze Code schicken.

Code: Alles auswählen

UPPER = 23
LOWER = 21
luefter_an = False

while True:
    netzwerkschranktemp = sensorauslesen()

    if luefter_an == True and netzwerkschranktemp < LOWER:
        luefter_an = False
        gpio.output(11, gpio.HIGH)

    if luefter_an == False and netzwerkschranktemp > UPPER:
        luefter_an = True
        gpio.output(11, gpio.LOW)

    time.sleep(899)
Ich frage meinen DS18B20 Sensor im Netzwerkschrank ab und schalte einen Lüfter in je nach Zustand und Temperatur an oder aus.
Das ganze funktioniert wie oben zu sehen wunderbar. Alle 15 Min läuft die Schleife.

Jetzt will ich das ganze aber auf einen Cronjob umbauen und dazu benötige ich eine Datei um den Zustand zu speichern.
Ich habe bisher folgendes probiert:

Code: Alles auswählen

file = open("netzwerkschrank.txt", "r")
luefter_an = (file.read())
file.close

if luefter == True and netzwerkschranktemp < LOWER:
    file = open("netzwerkschrank.txt", "w")
    file.write("False")
    file.close
    gpio.output(11, gpio.HIGH)

if luefter == 'aus' and netzwerkschranktemp > UPPER:
    file = open("netzwerkschrank.txt", "w")
    file.write("True")
    file.close
    gpio.output(11, gpio.LOW)
Ich habe auch mit True und False mit "" getestet. Also
if luefter == "True" and.....
Beides funktioniert leider nicht.
Lese ich die Datei aus, dann wird auch der Inhalt ausgelesen. Je nachdem ob ich beim ersten Start True oder False rein schreibe.

Auch habe ich das ganze nochmal anders getestet:
if luefter == 'an' and netzwerkschranktemp < LOWER:
file = open("netzwerkschrank.txt", "w")
file.write("aus")
file.close
gpio.output(11, gpio.HIGH)

if luefter == 'aus' and netzwerkschranktemp > UPPER:
file = open("netzwerkschrank.txt", "w")
file.write("an")
file.close
gpio.output(11, gpio.LOW)
Auch hier wir die Datei sauber ausgelesen entweder mit "an" oder mit "aus".

In allen Fällen, wird aber nichts in die Datei geschrieben.

Ich habe mir ein paar Print ausgaben dazu gebaut um zu sehen, ob überhaupt in die IF Abfrage gesprungen wird. Das ist leider nicht der Fall.
Ich vermute, dass hier mit dem Dateityp und der IF Abfrage irgendwas nicht stimmt.

Vielleicht kann mir jemand einen Tipp in die richtige Richtung geben.

Danke

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

Verfasst: Donnerstag 3. März 2022, 09:48
von noisefloor
Hallo,

`close ` ist eine Methode des Dateiobjekt, d.h. du musst die Methode auch aufrufen: `file.close()` - bei dir fehlen die Klammern.

Und am besten direkt das `with` Statement nehmen, dann kümmert sich Python um's Schließen der Datei:

Code: Alles auswählen

>>> with open('foo.txt', 'w') as file:
...     file.write('true')
...
4
>>> with open('foo.txt', 'r') as file:
...     data = file.read()
...
>>> data
'true'
>>> data == 'true'
True
Gruß, noisefloor

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

Verfasst: Donnerstag 3. März 2022, 10:12
von __deets__
Der Vergleich mit True/False muss fehlschlagen, schließlich vergleichst du Äpfel-strings mit wahrheitswert-Birnen.

Wenn du mit einem String verglichen hast, dann ist der Inhalt eben nicht das gewesen, mit dem du verglichen hast. Leerzeichen oder Zeilenumbrüche zb können das komplizierter machen.

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

Verfasst: Donnerstag 3. März 2022, 10:13
von wusa
Ich komme leider wieder nicht in die IF Abfrage rein.

Code: Alles auswählen

if luefter_an == True and netzwerkschranktemp < LOWER:
    print("aus")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("False")
    gpio.output(11, gpio.HIGH)
   
if luefter_an == False and netzwerkschranktemp > UPPER:
    print("an")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("True")
    gpio.output(11, gpio.LOW)


Es wird mir kein Print zurückgegeben.
Ich habe es auch mit "True" und "False" in "" getestet. Bringt leider keine Änderung.

Am Anfang frage ich die Datei an mit:

Code: Alles auswählen

with open('netzwerkschrank.txt', 'r') as file:
    luefter_an = file.read()
print(luefter_an)
Rückgabewert ist:
True
True habe ich beim erstellen der Datei selbst rein geschrieben.

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

Verfasst: Donnerstag 3. März 2022, 10:15
von wusa
__deets__ hat geschrieben: Donnerstag 3. März 2022, 10:12 Der Vergleich mit True/False muss fehlschlagen, schließlich vergleichst du Äpfel-strings mit wahrheitswert-Birnen.

Wenn du mit einem String verglichen hast, dann ist der Inhalt eben nicht das gewesen, mit dem du verglichen hast. Leerzeichen oder Zeilenumbrüche zb können das komplizierter machen.
Wie kann ich sowas dann umsetzen? Ich habe auch schon versucht mit luefter == an oder luefter == aus. Dann müsste ich nicht mit wahrheitswerten arbeiten.

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

Verfasst: Donnerstag 3. März 2022, 10:30
von __deets__
Du musst eben die korrekten strings vergleichen. Was steht in der datei? Stimmt die groß/Kleinschreibung? Sind die Leerzeichen alle mit strip entfernt? Du kannst dir mit print(repr(Inhalt)) anschauen, was du da genau drin hast.

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

Verfasst: Donnerstag 3. März 2022, 10:31
von Sirius3
Man vergleicht nicht explizit mit True oder False, sondern nutzt `luefer_an` bzw `not luefter_an`. Man sollte keine magischen Zahlen benutzen, definiere Konstanten.

Code: Alles auswählen

LUEFTER_PIN = 11
UPPER = 23
LOWER = 21
luefter_an = False

while True:
    netzwerkschranktemp = sensorauslesen()

    if luefter_an:
        if netzwerkschranktemp < LOWER:
            luefter_an = False
            gpio.output(LUEFTER_PIN , gpio.HIGH)
    else:
        if netzwerkschranktemp > UPPER:
            luefter_an = True
            gpio.output(LUEFTER_PIN , gpio.LOW)

    time.sleep(899)
Du hast Text, also mußt Du mit einem String vergleichen. Benutze Konstanten für den Dateinamen

Code: Alles auswählen

SCHRANK_FILENAME = "netzwerkschrank.txt"
with open(SCHRANK_FILENAME):
    luefter_an = file.read().strip() == "True"

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

Verfasst: Donnerstag 3. März 2022, 11:02
von wusa

Code: Alles auswählen

print(repr(Inhalt))
Bringt folgende Ausgabe:

Code: Alles auswählen

'an'\n
Ich konnte es mit Strip entfernen, komme aber auch so nicht weiter.

Auch habe ich den Ansatz von @Sirius3 getestet:

Code: Alles auswählen

Netzwerkschrankfile = "netzwerkschrank.txt"
with open(Netzwerkschrankfile) as file:
    luefter_an = file.read().strip() == "True"
    print(repr(luefter_an))
    print(type(luefter_an))
Als Rückgabewert kommt

Code: Alles auswählen

True
<class 'bool'>

Code: Alles auswählen


if luefter_an == 'True' and netzwerkschranktemp < LOWER:
    print("aus")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("False")
    gpio.output(11, gpio.HIGH)
 
if luefter_an == 'False' and netzwerkschranktemp > UPPER:
    print("an")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("True")
Auch hier komme ich nicht in die IF Abfrage rein. Ich bekomme kein Print aus der IF Abfrage zurück. Auch hier wieder mit und ohne "" getestet.

Das es Nachholbedarf bei den Konstanten gibt, das ist mir bewusst. Das würde ich im Nachgang dann anpassen.

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

Verfasst: Donnerstag 3. März 2022, 11:06
von __deets__
Dir ist augenscheinlich nicht klar, dass strings in Dateien ohne "" gehören. Das ist notwendig in *Python*, weil da nunmal unterschieden werden muss zwischen einem Bezeichner und einem String literal. Aber die haben in deiner Datei nix zu suchen, und entsprechend schlägt der Vergleich auch fehl, wenn du nur auf "an" oder "aus" vergleichst, aber "''an'" oder "'aus'" da drin steht.

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

Verfasst: Donnerstag 3. März 2022, 11:12
von wusa
In meiner Datei steht nur
an
ohne ""

Die "" werden nur angezeigt, wenn ich mit der repr Funktion mir den Inhalt anzeigen lasse

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

Verfasst: Donnerstag 3. März 2022, 11:15
von __deets__
Dann stimmt das was du da oben gepostet hast nicht. Denn da steht klar ein \n *nach* einem Anführungszeichen! Wenn du hier falsche Informationen postest, weil du irgendwas irgendwie aus dem Gedächtnis hinschluderst, dann wird’s nix.

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

Verfasst: Donnerstag 3. März 2022, 11:22
von wusa
Sorry. Das war echt keine Absicht. Ich probiere momentan einfach, wie es funktionieren könnte und hab die Zeile nicht kopiert, sondern abgeschrieben.

Jetzt extra nochmal getestet. Sieht wie folgt aus:

Code: Alles auswählen

'an\n'

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

Verfasst: Donnerstag 3. März 2022, 11:28
von __deets__
Dann geht das hier:

Code: Alles auswählen

inhalt = 'an\n'
print(inhalt.strip() == "an")

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

Verfasst: Donnerstag 3. März 2022, 11:29
von pillmuncher
@wusa: Und wass sollte deiner Meinung nach herauskommen, wenn du 'an\n' und 'True' vergleichst? Oder 'an' und 'True'? Oder 'an' und 'False'?

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

Verfasst: Donnerstag 3. März 2022, 12:06
von wusa
@pillmuncher

Ich will ja nicht "an" und "True" vergleichen. Das waren mehrere Lösungsansätze.

Bisher komme ich aber noch nicht zu einer Lösung

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

Verfasst: Donnerstag 3. März 2022, 12:10
von Sirius3
Wie sieht denn Dein jetziger Code aus?

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

Verfasst: Freitag 4. März 2022, 08:28
von wusa
Sorry für die späte Rückmeldung.
In der Datei Netzwerkschrankfile steht folgendes: Ohne irgendwelche sonstige Zeichen.

Code: Alles auswählen

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

print(repr(luefter))
print(type(luefter))
Ausgabe:

Code: Alles auswählen

'an'
<class 'str'>

Code: Alles auswählen

if luefter_an == 'an' and netzwerkschranktemp < LOWER:
    print("aus")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("aus")
    
if luefter_an == 'an' and netzwerkschranktemp > UPPER:
    print("an")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("an")
Ich habe gestern noch ein wenig probiert. Aber bisher noch keine Lösung gefunden.

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

Verfasst: Freitag 4. März 2022, 08:55
von __deets__
Da steht einmal luefter. Und einmal luefter_an. Und warum steht der Code zur Ausgabe nicht an oder kurz vor der Stelle, wo du das prüfst? Und welchen Inhalt hat die Temperatur?

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

Verfasst: Freitag 4. März 2022, 09:21
von wusa
Ich habe gestern noch zu viel probiert und dann irgendwann abgebrochen. Das passe ich natürlich an. Das sollte so nicht sein.

Inhalt der Temperatur ist der Wert, der aus dem DS18B20 kommt.

Code: Alles auswählen

def sensorauslesen():
    try:
            sensor = open(netzwerkschrank)
            sensordata = sensor.read()
            sensor.close()
            tempdata = sensordata.split("\n")[1].split(" ")[9]
            temp_netzwerkschrank = float(tempdata[2:])
            temp_netzwerkschrank = temp_netzwerkschrank / 1000
            return temp_netzwerkschrank

Code: Alles auswählen

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

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)


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

Verfasst: Freitag 4. März 2022, 10:10
von __deets__
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.