RouvenE Geschrieben October 10, 2015 at 14:27 Geschrieben October 10, 2015 at 14:27 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. Zitieren
remotecontrol Geschrieben October 10, 2015 at 17:52 Geschrieben October 10, 2015 at 17:52 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. Zitieren
RouvenE Geschrieben October 10, 2015 at 18:04 Autor Geschrieben October 10, 2015 at 18:04 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). Zitieren
remotecontrol Geschrieben October 10, 2015 at 18:21 Geschrieben October 10, 2015 at 18:21 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. Zitieren
RouvenE Geschrieben October 10, 2015 at 19:08 Autor Geschrieben October 10, 2015 at 19:08 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. Zitieren
remotecontrol Geschrieben October 11, 2015 at 08:40 Geschrieben October 11, 2015 at 08:40 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: ... Zitieren
RouvenE Geschrieben October 17, 2015 at 18:30 Autor Geschrieben October 17, 2015 at 18:30 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, Zitieren
photron Geschrieben October 19, 2015 at 08:10 Geschrieben October 19, 2015 at 08:10 Es muss wahrscheinlich weather_station.lcd.backlight_off() sein. So wie dein Script gerade gebaut ist gibt es der Stelle kein self. Zitieren
RouvenE Geschrieben October 22, 2015 at 07:17 Autor Geschrieben October 22, 2015 at 07:17 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. Zitieren
MacDuff Geschrieben October 24, 2015 at 09:23 Geschrieben October 24, 2015 at 09:23 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 Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.