Alle 15 Minuten logfile schreiben

  • Hallo,

    ich habe noch ein weiteres Problem.

    In meinem Skript, welches basierend auf Luftfeuchtigkeit und Temperatur entscheidet, ob ein Servo-Motor schaltet würde ich gerne alle 15 Minuten in ein logfile mit den beiden Werten schreiben. Das hinzufügen zur txt-datei klappt auch, aber es wird nicht nur alle 15 Minuten gemacht. Ich habe geplant es so zu lösen:


    Python
    def append():   
        current_time = datetime.now() 
        if current_time.minute == 0 or 15 or 30 or 45:        
            save_file = open('/home/pi/Desktop/cookie/Gewächshaus_log/Humidity' + str(current_time.strftime('%Y.%m.%d')) +'.txt','a')        
            save_file.write(str(time) + '\n' + str(round(mh,2)) + '%\n' + str(round(mt,2)) + '°C\n\n')        
            save_file.close()        
            print('log file written')


    Irgendeinen (kleinen) Fehler habe ich doch bestimmt gemacht ^^


    Gruß, Tom



    P.S.: Hier noch das komplette Skript, das bestimmt auch noch Schwächen hat. :D

  • if current_time.minute == 0 or 15 or 30 or 45:

    Das ist falsch. Zahlen ungleich 0 evaluieren zu True. Dein Statement ist quasi:


    Python
    if current_time.minute == 0 or True or True or True:

    Lösung:

    Python
    if current_time.minute == 0 or current_time.minute == 15 or current_time.minute == 30 or current_time.minute == 45:

    Besser:

    Code
    if current_time.minute in (0, 15, 30, 45):

    HTH

  • Code
    if current_time.minute in (0, 15, 30, 45):

    Super, danke ::) Mir erschien das so logisch ^^

    Gleiches Thema wie vorhin => nutze crontab und verzichte auf eine while

    Wirklich? Das Skript soll doch aber permanent die Temperatur überprüfen.

    Zu warm = 2 Minuten warten -> Luke auf -> 1 Minute Warten -> wieder überprüfen

    kalt genung = sofort wieder überprüfen


    Wenn ich das Skript nur alle 4 Minuten laufen lasse, laufe ich doch Gefahr, dass es zu warm wird ohne, dass der Motor reagiert.

    Und jede Minute kann ich es ja bestimmt nicht laufen lassen, ohne dass es einen Fehler gibt oder?


    Gruß, Tom

  • Hallo,


    Tillmario:


    • Logging geht besser mit dem `logging` Modul. Das unterstützt auch logrotate, so dass du dir nicht selber alles 24h eine neue Datei "basteln" musst.
    • Strings formatiert man mit der `format` Methode, nicht mit `+`.
    • Datei- / Verzeichnisnamen baut man mit `os.path.join()` zusammen.
    • Dateien öffnet man besser mit dem `with` Statement, dann hat man auch die Garantie, dass die Datei geschlossen wird.
    • `append` als Funktionsnamen ist nichtssagend. append to what? `append_to_logfile` wäre z.B. besser.


    Du hast eine eigene Funktion genau so benannt wie eine Methode. Das geht schief. Du musst deine eigene Funktion anders benennen.

    Die Aussage ist so falsch, muss der TE nicht. BTW: welche Methode? ;) Methodennamen existieren nur im Namensraum der Klasse bzw. der Instanzen der Klasse-. Da gibt's keine Kollisionen, wenn verschiedene Instanzen verschiedener Klassen gleiche Methodennamen haben. Beispiele: sowohl Listen als als `collections.deque` haben eine `append` Methode. Funktioniert bekanntlich einwandfrei.


    Gruß, noiserfloor