Seite 1 von 1

brauche hilfe bei einen script

Verfasst: Mittwoch 29. Januar 2020, 06:39
von SniffySplash769
mit deisen script versuche ich gerade eine chinesische qlocktwo zu programmieren, doch ich habe einen syntax Fehler den ich gerade nicht finde.

import RPi.GPIO as GPIO
from datetime import datetime
import time
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

GPIO.setup(2, GPIO.OUT)
GPIO.setup(3, GPIO.OUT)
GPIO.setup(4, GPIO.OUT)
GPIO.setup(5, GPIO.OUT)
GPIO.setup(6, GPIO.OUT)
GPIO.setup(7, GPIO.OUT)
GPIO.setup(8, GPIO.OUT)
GPIO.setup(9, GPIO.OUT)
GPIO.setup(10, GPIO.OUT)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(12, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(16, GPIO.OUT)
GPIO.setup(17, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)
GPIO.setup(19, GPIO.OUT)

GPIO.output(2, GPIO.HIGH)
GPIO.output(3, GPIO.HIGH)
GPIO.output(4, GPIO.HIGH)
GPIO.output(5, GPIO.HIGH)
GPIO.output(6, GPIO.HIGH)
GPIO.output(7, GPIO.HIGH)
GPIO.output(8, GPIO.HIGH)
GPIO.output(9, GPIO.HIGH)
GPIO.output(10, GPIO.HIGH)
GPIO.output(11, GPIO.HIGH)
GPIO.output(12, GPIO.HIGH)
GPIO.output(13, GPIO.HIGH)
GPIO.output(16, GPIO.HIGH)
GPIO.output(17, GPIO.HIGH)
GPIO.output(18, GPIO.HIGH)
GPIO.output(19, GPIO.HIGH)


while True:
hour = time.localtime().tm_hour
minute = time.localtime().tm_min - 50
#minute = time.strftime("%M")
#gesamtzeit = (hour, minute)

# if (minute == 1):
# GPIO.output(2, GPIO.LOW)
#
# else :
# if (minute == 2):
# GPIO.output(2, GPIO.HIGH)
# GPIO.output(3, GPIO.LOW)
# else :
#
# if (minute == 3):
# GPIO.output(3, GPIO.HIGH)
# GPIO.output(4, GPIO.LOW)
#
# else :
# GPIO.output(4, GPIO.HIGH)
#
# if (minute == 4):
# GPIO.output(5, GPIO.LOW)
# else :
#
if (minute == 5 or minute== 25 or minute == 25 or minute == 55):
GPIO.output(6, GPIO.LOW)

else :

if(minute == 15):
GPIO.output(17, GPIO.LOW)
GPIO.output(18, GPIO.LOW)

else :
GPIO.output(17, GPIO.HIGH)
GPIO.output(18, GPIO.HIGH)

if (minute == 45):
GPIO.output(17, GPIO.LOW)
GPIO.output(18, GPIO.LOW)

else :
GPIO.output(17, GPIO.HIGH)
GPIO.output(18, GPIO.HIGH)

if (minute == 30):
GPIO.output(19, GPIO.LOW)
else :
GPIO.output(19, GPIO.HIGH)


if (minute > 39 or minute < 50 and minute != 45):
GPIO.output(20, GPIO.LOW)

else :
GPIO.output(20, GPIO.HIGH)

if (minute == 11):
GPIO.output(11, GPIO.LOW)
GPIO.output(2, GPIO.LOW)

else :
if (minute == 12):
GPIO.output(11, GPIO.LOW)
GPIO.output(3, GPIO.LOW)

else :
if (minute == 13):
GPIO.output(11, GPIO.HIGH)
GPIO.output(4, GPIO.HIGH)

else:
if (minute == 14):
GPIO.output(11, GPIO.LOW)
GPIO.output(5, GPIO.LOW)

else :
if (minute == 15):
GPIO.output(11, GPIO.LOW)
GPIO.output(6, GPIO.LOW)

else :
if (minute == 16):
GPIO.output(11, GPIO.LOW)
GPIO.output(7, GPIO.LOW)

else :
if (minute == 17):
GPIO.output(11, GPIO.LOW)
GPIO.output(8, GPIO.LOW)

else :
if (minute == 18):
GPIO.output(11, GPIO.LOW)
GPIO.output(9, GPIO.LOW)

else :
GPIO.output(2, GPIO.HIGH)
GPIO.output(3, GPIO.HIGH)
GPIO.output(4, GPIO.HIGH)
GPIO.output(5, GPIO.HIGH)
GPIO.output(6, GPIO.HIGH)
GPIO.output(7, GPIO.HIGH)
GPIO.output(8, GPIO.HIGH)
GPIO.output(9, GPIO.HIGH)
GPIO.output(10, GPIO.HIGH)
GPIO.output(11, GPIO.HIGH)
GPIO.output(12, GPIO.HIGH)
GPIO.output(13, GPIO.HIGH)
GPIO.output(16, GPIO.HIGH)
GPIO.output(17, GPIO.HIGH)
GPIO.output(18, GPIO.HIGH)
GPIO.output(19, GPIO.HIGH)


ich wuerde mich auf eine Antwort freuen :wink:
Vielen Dank vorraus.

Re: brauche hilfe bei einen script

Verfasst: Mittwoch 29. Januar 2020, 14:15
von __deets__
Bitte den Code in Code Tags packen damit er leserlich ist. Und natürlich brauchen wir auch den Fehler. Vollständig.

Re: brauche hilfe bei einen script

Verfasst: Mittwoch 29. Januar 2020, 14:26
von __blackjack__
@SniffySplash769: Führe es einfach mal aus, dann verrät Dir der Compiler *wo* der Fehler ist:

Code: Alles auswählen

$ python3 ./forum7.py 
  File "./forum7.py", line 91
    if (minute == 30):
                     ^
IndentationError: unindent does not match any outer indentation level
Zeile 91. Die Einrückung passt ganz offensichtlich nicht.

Um die Bedingungen bei ``if`` gehören übrigens keine überflüssigen Klammern. Und zwischen ``else`` und dem ``:`` kein Leerzeichen. Zudem kennt Python ``elif`` mit dem sich hier wohl einiges an Einrückebenen sparen lässt, womit man vielleicht auch eine Chance hat das auf eine sinnvolle maximale Zeilenlänge zu begrenzen.

Re: brauche hilfe bei einen script

Verfasst: Mittwoch 29. Januar 2020, 14:29
von Sirius3
Warnungen sind dazu da, dass man sie behebt, nicht dass man sie ignoriert. Dazu muß man aber auch verläßlich GPIO.cleanup aufrufen, z.B. in einem finally-Block.
Zweimal localtime aufzurufen, um einmal die Minuten und einmal die Stunden abzufragen, ist falsch, da die beiden Zeiten dann nicht zusammen gehören.
Um die Bedingung von if gehört keine Klammern.
Es gibt so etwas wie elif, damit man keine achtzehn! Einrückebenen braucht. Eingerückt wird überigens immer mit 4 Leerzeichen pro Ebene, bei Dir kommst Du ungefähr bei Minute 30 mit der Einrückung total durcheinander. Bei Minute 11 dann wieder. Wie es genau aussehen müßte kann ich nicht sagen, weil ich ja nicht weiß, was Du machen willst.

Welche GPIOs werden denn bei welcher Minute geschaltet? Fass das mal in einer Tabelle zusammen. Dann kannst Du diese Tabelle benutzen um alle if-Abfragen zu ersetzen.

Re: brauche hilfe bei einen script

Verfasst: Mittwoch 29. Januar 2020, 14:40
von /me
Für diese lange Initialisierung oben bietet sich ja eine Schleife an.

Code: Alles auswählen

    for gpio_port in range(2, 14):
        GPIO.setup(gpio_port, GPIO.OUT)
        GPIO.output(gpio_port, GPIO.HIGH)
    for gpio_port in range(16, 20):
        GPIO.setup(gpio_port, GPIO.OUT)
        GPIO.output(gpio_port, GPIO.HIGH)
Man kann das auch kombinieren.

Code: Alles auswählen

    import itertools
    for gpio_port in itertools.chain(range(2, 14), range(16, 20)):
        GPIO.setup(gpio_port, GPIO.OUT)
        GPIO.output(gpio_port, GPIO.HIGH)
Alternativ baust du dir einmalig eine Liste aller Ports auf und iterierst dann darüber.

Re: brauche hilfe bei einen script

Verfasst: Mittwoch 29. Januar 2020, 15:42
von Sirius3
@/me: man kann auch ausnutzen, dass setup mit Listen klar kommt und den Initialwert setzen kann:

Code: Alles auswählen

gpio_ports = list(range(2,14)) + list(range(16,20))
GPIO.setup(gpio_ports, GPIO.OUT, initial=GPIO.HIGH)