Jump to content

Python-Script abbrechen und Display aus


RouvenE

Recommended Posts

Hallo,

 

Momentan werkelt mein Tinkerforge-Wetterstations-Kit in Zusammenarbeit mit einem Raspberry Pi 2 und dem Standard-Wetterstations-Beispielcode.

 

Noch immer nicht habe ich Zeit finden können, endlich Python zu lernen.

 

Was ich momentan einfach nur ändern möchte, ist, dass die Wetterstation nachts ab 22 Uhr bis morgens 6 Uhr das LCD-Backlight ausschaltet...

 

Im Grunde müsste man doch in Python eine Uhrzeitabfrage einfügen können, die die Zeit prüft und das Backlight eben dann aus- und 1x/Tag wieder einschaltet.

 

Oder ist ggf. ein cronjob machbar, der das Script nachts beendet und morgens startet ? Aber dann würde das Display eingeschaltet bleiben.

 

Vielleicht hat ja jemand eine kurze Idee, die ich übergangsweise schnell nutzen könnte. Bis ich soweit bin, hat meine Frau sich zahlreich über das ständig leuchtende Display zu oft beschwert.

Link zu diesem Kommentar
Share on other sites

Im Prinzip passt die "while" Schleife (die ich im anderen Thread erwähnt habe) gut, um jeweils die aktuelle Zeit zu prüfen, das würde dann grob so aussehen:

 

import time

while 1:
    ts = time.localtime()
    if ts.tm_hour == 22 and ts.tm_minute == 0:
        print "Light off"
    if ts.tm_hour == 6 and ts.tm_minute == 0:
        print "Light on"
    time.sleep(30)

 

Den sleep-Wert kann Du noch optimieren. Hier würde das Skript ggf. 2x in einer Minute was machen. Ein "sleep(60)" könnte aber prinzipiell dazu führen, dass man eine Minute übersprungen wird. Anstelle des "print" musst Du dann das backlight steuern.

Link zu diesem Kommentar
Share on other sites

Ok, den Backlicht-Schaltbefehl bekomme ich hin...

Ist es denn so zu coden, dass das Problem im anderen Thread behoben wird und das Script alle paar Minuten aufwacht ? Würde heißen, wenn _nach_ 22 Uhr aus, sonst ab 6:xx Uhr an.

 

Aber, der Code würde nicht ständig schalten ? Derzeit schaltet es nur, wenn es genau 22 Uhr oder 6 Uhr ist (wozu aber ständig abgefragt wird).

 

Link zu diesem Kommentar
Share on other sites

Auch zur Frage "wo" das eingebaut werden müsste, diese Zeile

 

input('Press key to exit\n')

 

müsstest Du durch die while-Schleife ersetzen, die endlos läuft und z.B. alle 30 Sekunden die Uhrzeit abfragt.

 

Die Abfragen in meinem Beispiel würden um 22:00 (exakt 22 Uhr) das Licht ausschalten und genau um 6:00 wieder ein. Wenn das Skript zwischen 22 und 6 Uhr beendet und neu gestartet würde, würde es nicht schalten, das Licht bliebe unverändert.

Link zu diesem Kommentar
Share on other sites

if __name__ == "__main__":
    log.info('Weather Station: Start')

    weather_station = WeatherStation()

    if sys.version_info < (3, 0):
        input = raw_input # Compatibility for Python 2.x


import time

while 1:
    ts = time.localtime()
    if ts.tm_hour == 22 and ts.tm_minute == 0:
        lcd.backlight_off()
    if ts.tm_hour == 6 and ts.tm_minute == 0:
        lcd.backlight_on()
    time.sleep(50)

    if weather_station.ipcon != None:
        weather_station.ipcon.disconnect()

    log.info('Weather Station: End')

 

Habe es nun dort eingefügt...

 

Nun startet das LCD tatsächlich beim Start des RPi und zeigt Werte an, jedoch unter einer Minute, denn dann friert das Display ein, während der RPi normal weiter läuft.

 

EDIT:

Nein, das Display läuft weiter, passt die Werte anfangs sekündlich an, dann scheinbar 1 x / Minute.

Link zu diesem Kommentar
Share on other sites

Sorry, aber Du solltest wirklich etwas mehr Python lernen (ich kann's eigentlich auch nicht):

die Einrückung ist extrem wichtig. Du hast die while-Schleife falsch eingerückt und der Import ist wohl überflüssig, da Du ihn ganz am Anfang ja schon drin hast.

 

Also in etwa so (Du kannst ja mit den Uhrzeiten und Minuten mal spielen, dann siehst Du, ob das klappt):

 

    ...
    if sys.version_info < (3, 0):
        input = raw_input # Compatibility for Python 2.x

    while 1:
        ts = time.localtime()
        if ts.tm_hour == 22 and ts.tm_minute == 0:
            lcd.backlight_off()
        if ts.tm_hour == 6 and ts.tm_minute == 0:
            lcd.backlight_on()
        time.sleep(50)

    if weather_station.ipcon != None:
    ...

Link zu diesem Kommentar
Share on other sites

Hi,

 

Ich habe die Einrückungen korrigiert... ich bin dermaßen wenig daheim, dass ich keine Zeit finde, mir Python anzueignen, was sich ändern soll. Derzeit möchte ich einfach nur das Display zu bestimmten Uhrzeiten schalten, damit es daheim bei der Familie nicht nervt.

 

Die Einrückungen haben funktioniert, das Script läuft.

 

Allerdings, zur angegebenen Ausschaltzeit läuft der Pi weiter, das Display friert jedoch ein und wacht auch nicht mehr auf.

 

Den folgenden Code habe ich ohne Besserung geändert:

lcd.backlight_off()

in

self.lcd.backlight_off()

 

Vielleicht weiß ja jemand den entscheidenden Hinweis um dieses Problemchen zu beheben,

Link zu diesem Kommentar
Share on other sites

Es ist merkwürdig... habe es angepasst.

 

Jedoch, der RPi friert zur Schalt-Uhrzeit (22 Uhr) komplett ein und reagiert nicht mehr. Habe eine unterbrechungsfreie Stromversorgung angeschlossen, die den RPi herunterfährt, wenn ich den Strom trenne (da der RPi ja nicht mehr erreichbar ist). Ggf. sagt das ja jemandem etwas, dass dieses noch agiert, wobei ich nicht genau sagen kann, ob es dann tatsächlich den RPi noch herunterfahren kann oder dann nach eingestellten 90 Sekunden simpel den Strom trennt.

 

 

Link zu diesem Kommentar
Share on other sites

Timer-gesteuerte Dinge sind in Python etwas tricky. Ich habe kürzlich ein Modul entdeckt, mit dem regelmäßige/wiederkehrende etc Aktionen recht simpel zu programmieren sind -- siehe:

https://github.com/dbader/schedule

Das sieht dann so aus:

import schedule
import time

def job():
    print("I'm working...")

schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

 

Vielleicht hilft dir das ja.

md

 

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...