Seite 1 von 1

LEDs ausschalten bei Skript Ende

Verfasst: Montag 3. Februar 2020, 19:12
von Frank R.
Hallo Forum,

ich habe hier ein kleines Problem. Folgendes Skript funktioniert zwar, aber wenn ich es beende, z.B. in Thonny über "Stop/Restart Backend", bleibt der aktuelle Zustand der LEDs aktiv.
Irgendwo muss da doch ein zusätzliches gpio cleanup oder sowas wie leds.off() rein, aber wo?

Code: Alles auswählen

from gpiozero import LEDBoard
from time import sleep

def play_leds(leds):
    leds[0].on()
    sleep(1)
    leds[1].on()
    sleep(1)
    leds[2].on()
    sleep(1)
    leds[3].on()
    sleep(1)
    leds[4].on()
    sleep(1)
    leds[5].on()
    sleep(1)
    leds[6].on()
    sleep(1)
    leds[7].on()
    sleep(1)
    leds[8].on()
    sleep(3)
    leds.off()
    sleep(3)

def main():
    leds = LEDBoard(17, 18, 27, 22, 23, 24, 25, 4, 12)
    while True:
        play_leds(leds)

if __name__ == '__main__':
    main()
Wenn ich das Skript laufen lasse passt alles soweit, die LED werden nacheinander angeschaltet und die Schleife läuft unendlich durch. Allerdings müssen alle LEDs ausgeschaltet werden, wenn ich das Skript beende/anhalte.

Besten Dank für Eure Hilfe :D

Re: LEDs ausschalten bei Skript Ende

Verfasst: Montag 3. Februar 2020, 19:35
von Sirius3
Dafür brauchst Du einen finally-Block:

Code: Alles auswählen

from gpiozero import LEDBoard
from time import sleep

def play_leds(leds):
    for led in lds:
        led.on()
        sleep(1)
    sleep(2)
    leds.off()
    sleep(3)

def main():
    leds = LEDBoard(17, 18, 27, 22, 23, 24, 25, 4, 12)
    try:
        while True:
            play_leds(leds)
    finally:
        leds.off()

if __name__ == '__main__':
    main()

Re: LEDs ausschalten bei Skript Ende

Verfasst: Montag 3. Februar 2020, 19:54
von Frank R.
Hallo Sirius3,
habe Deinen Code eben getestet, funktioniert leider nicht. Wenn ich das Skript beende bleiben die LEDs nach wie vor aktiviert. Da ist auch ein Tippfehler drin den ich beheben musste, statt "leds" hast Du ein mal "lds" geschrieben.

Re: LEDs ausschalten bei Skript Ende

Verfasst: Montag 3. Februar 2020, 20:01
von Sirius3
Dann macht Dein Thonny böse Sachen, nämlich Programme ohne Grund hart abbrechen.

Re: LEDs ausschalten bei Skript Ende

Verfasst: Montag 3. Februar 2020, 20:12
von Frank R.
Habe Version 3.2.6 installiert. Raspi heute erst aktualisiert. Bin schon etwas erstaunt, wenn ich das Skript per Strg+C beende, gehen die LEDs tatsächlich aus. Ist das bei Thonny normal, dass ein Klick auf "Stop/Restart Backend" solche Probleme verursacht? Also stimmt Dein Skript so doch.

Re: LEDs ausschalten bei Skript Ende

Verfasst: Montag 3. Februar 2020, 20:35
von __deets__
Man muesste jetzt in Thonny suchen, oder in dessen Code schauen, wie genau das ein Skript ausfuehrt, und was es da ggf. fuer Alternativen gibt. Theoretisch ist es moeglich, die KeyboardInterrupt-Exception abzufangen, und dadurch wuerde das beenden in Thonny nicht mehr gehen. Darum haben die da ggf. einen rabiateren Weg gewaehlt.

Re: LEDs ausschalten bei Skript Ende

Verfasst: Dienstag 4. Februar 2020, 01:31
von __blackjack__
Selbst dann sollte es doch aber noch einen Unterschied zwischen „terminate“ und „kill“ geben.

Re: LEDs ausschalten bei Skript Ende

Verfasst: Dienstag 4. Februar 2020, 01:32
von __deets__
Auch SIGTERM lässt sich doch abfangen?

Re: LEDs ausschalten bei Skript Ende

Verfasst: Dienstag 4. Februar 2020, 01:44
von __blackjack__
@__deets__: Ja aber das macht deutlich weniger Software, beziehungsweise wenn, dann in der Regel um ordentlich aufzuräumen bevor sie sich beendet. Ich würde „kill“ wirklich nur an Prozesse senden die eine gewisse Zeit nicht mehr reagieren.

Re: LEDs ausschalten bei Skript Ende

Verfasst: Dienstag 4. Februar 2020, 11:07
von DeaD_EyE
Webserver lassen sich z.B. über Signale steuern. Bei Datenbanken ist es z.B. auch wichtig, dass zu ende geschrieben wird, um Inkonsistenzen zu vermeiden.
SIGTERM wäre der richtige Weg und SIGKILL kann man nicht abfangen und ist quasi der letzte Ausweg.