Posts by gottfried50

    Hallo,


    ich habe einen Raspi mit Edimax-Wlan-USB-Stick ausgerüstet. Das funktioniert ausgezeichnet (mit Eurer Hilfe :)


    Nun ein sonderbarer Effekt: wenn der Wlan-Router ausfällt und wieder eingeschaltet wird, findet der Raspi nicht ins Wlan zurück, auch wenn ich den Edimax ausstecke und wieder einstecke.


    Ist das "normal" für Edimax? Ist das normal für alle Wlan-Sticks? Was macht man da so?


    Danke Euch


    Gottfried

    Großes DANKE


    Hallo,


    ich habe meine unbefriedigende Lösung mit Lambda von ...
    https://www.raspberrypi.org/fo…iewtopic.php?f=32&t=50833
    ... schlicht abgeschrieben - mit anderen Worten - ich kann das auch nicht erklären .. aber sie geht


    und selbst hier im Forum:
    http://www.forum-raspberrypi.d…-einsteigerfragen?page=24
    wird das mit Lambda gemacht.


    Was ich ... hmmm ... witzig finde: Die Frage war ja eine (mehrere) Callback mit Paramter - das steht doch groß und deutlich als Titel da .... ist das verloren gegangen?


    Also noch einmal: mein Code funktioniert wie am Anfang dargestellt. Die Frage ist >wieso geht das in der Schleife nicht< - meinetwegen mit "for i in switm...." und zweitens >wie kann man das mit einer Liste von Events in die selbe Callback machen?<


    Danke Euch


    Gottfried


    weil len eine länge zurück gibt. er würde er versuchen interupts für 0 und 1 zu setzen. (länge von switm =2, bei 0 angefangen zu zählen ergibt 0,1) Ein

    Code
    "for i in switm:
    GPIO.add_event_detect(i, GPIO.BOTH, callback=lambda x: ButtonPressed(switm[i]), bouncetime=BounceTime)

    sollte klappen


    Wo übergebe ich eine "Länge eines Listenobjektes" an irgendwen?
    [PHP]
    for i in range(len(switm)) : # geht nicht
    GPIO.add_event_detect(switm[i], GPIO.BOTH, callback=lambda x: ButtonPressed(switm[i]), bouncetime=BounceTime)
    [/PHP]
    und range(len(switm)) ist schlicht 0 und 1 .... oder übersehe ich da


    was?

    Hallo noisefloor



    Welchen Sinn hat denn das `lambda` beim Callback? Das ist IMHO überflüssig, weil du den Callback doch an die Funktion `ButtonPressed()` binden willst - und nicht an eine anonyme Lambda-Funktion.


    Im Beispiel wird eine Liste von Interrupts mit der selben Callback serviciert und dort muss ich die Information haben welcher es war. Und via Globals finde ich das nicht ... lustig.



    über eine Liste mittels `for in in range(len(...))` zu iterieren ist voll das Python Anti-Pattern - macht man nicht.


    OK, aber warum geht es nicht?


    Und das herzigste:
    [PHP]
    import RPi.GPIO as GPIO
    BounceTime=50 #[ms]
    GPIO.setmode(GPIO.BCM)
    switm=[23,24] # GPIOs Taster
    for i in switm :
    GPIO.setup(i,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
    print ('setup:',i)


    def ButtonPressed(value) :
    print ('ButtonPressed @ GPIO # :',value)


    for i in switm :
    print ('i:',i)
    GPIO.add_event_detect(i, GPIO.BOTH, callback=lambda x: ButtonPressed(i), bouncetime=BounceTime)
    """
    GPIO.add_event_detect(switm[0], GPIO.BOTH, callback=lambda x: ButtonPressed(switm[0]), bouncetime=BounceTime)
    GPIO.add_event_detect(switm[1], GPIO.BOTH, callback=lambda x: ButtonPressed(switm[1]), bouncetime=BounceTime)
    """
    [/PHP]


    funktioniert trotzdem nicht - egal welchen Taster man drückt value in ButtonPressed ist 24. Wenn man die beiden Elemente in switm tauscht dann eben 23 (immer der letzte). Und die brute-force Methode (auskommentiert) funktioniert!


    Womit wir am Ausgangspunkt der Frage wären - wie macht man das und warum geht es nicht?


    Danke


    Gottfried

    sorry - nein,


    ich musste Deinen Vorschlag etwas adaptieren weil
    [PHP]
    GPIO.add_event_detect(switm[i], GPIO.BOTH, callback=lambda x: ButtonPressed(switm[i]), bouncetime=BounceTime)
    [/PHP]
    ja in beiden Fällen (also 1. Parameter und parameter @ ButtonPressed) die GPIO Nummer übergeben werden muss. Ja und dann steht praktisch wieder dasselbe da wie bei mir und es kommt immer der als letzter definierte callback, also in meinem Fall 24.


    Ich vermute, dass Python hier eine Adresse (call by reference) übergibt und die Adresse von "i" ist immer die letzte...? Oder?


    Ich weiss auch nicht wie der "String"-Anfang vor der for Schleife gemeint war.


    Summa Summarum - geht nicht


    Gottfried

    Hallo,


    das Programm
    [PHP]
    import RPi.GPIO as GPIO
    BounceTime=50 #[ms]
    GPIO.setmode(GPIO.BCM)
    switm=[23,24] # GPIOs Taster
    for i in switm :
    GPIO.setup(i,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
    print ('setup:',i)


    def ButtonPressed(value) :
    print ('ButtonPressed @ GPIO # :',value)


    """for i in range(len(switm)) : # geht nicht
    GPIO.add_event_detect(switm[i], GPIO.BOTH, callback=lambda x: ButtonPressed(switm[i]), bouncetime=BounceTime)
    """
    GPIO.add_event_detect(switm[0], GPIO.BOTH, callback=lambda x: ButtonPressed(switm[0]), bouncetime=BounceTime)
    GPIO.add_event_detect(switm[1], GPIO.BOTH, callback=lambda x: ButtonPressed(switm[1]), bouncetime=BounceTime)
    [/PHP]
    funktioniert.


    ABER warum funktioniert der eleganter Weg (Auskommentiert) nicht. Ich hätte eine liste von solchen Funktionen zu starten.


    Bitte um eine "Umweg" :)


    Danke


    Gottfried

    Hallo,


    ist mir eher unklar warum Schreibfehler oder blanks etwas mit dem nicht-funktionieren zu tun haben


    > Verwendest du python2 oder python3?


    das steht am Anfang doch da: 3.2.3

    > Also zunächst mal hast "global" noch nicht verstanden. Wird eine Variable ausserhalb einer Funktion


    ist OK, aber stören darf das auch nicht in einem Testprogramm


    > Dann lässt sich dein Code schwer lesen da du nach Doppelpunkt ein Leerzeichen setzt
    > und auch vereinzelt vor ( ein Leerzeichen setzt.


    Den Einwurf verstehe ich nicht ... und dann geht es?


    > Du hast auch ein paar Schreibfehler, wobei kA ob das Absicht ist? stoping -> stopping. dely -> delay


    das dürfte denn genau der Grund sein ... ja genau



    > Dann versteh ich nicht was " if True: else:" für eine Abfrage sein soll? undefined


    etwas testweise auszukommentieren machst Du sicher mit einem OOP-Konstrukt


    > Wozu setzt du "t2 = (0.5,)" und fügst es dann noch mal mit args = (t2) ein? An beiden Stellen ( )


    es geht mit und ohne nicht


    > Beim setzen von th1 nutzt du target= aber hast kein weiteres Parameter trotzdem hast du ein ","


    es geht mit und ohne nicht



    > Und letzte Abschnitt ist ebenfalls seltsam. Die "while" nutzt du hier nur um das Script am beenden


    nein, das ist um das script zu beenden, auch wenn die threads nicht fertig sind.


    > Bereinige das erst mal

    Mit anderen Worten, du weisst auch nicht warum es nicht geht.
    Automatisch zusammengefügt:[hr]
    An alle Damen und Herrn Experten mit hoher OOP Bildung eine bescheidene Meldung von mir kleinen unwissenden Wurm:
    [PHP]
    th1=threading.Thread(target=plant_service(), ) # geht nicht
    th1=threading.Thread(target=plant_service ) # geht
    [/PHP]


    und das sogar mit Tippfehlern im Kommentar


    mit untertänigsten Grüßen
    Gottfried


    Kannst du mal bitte den kompletten Code zeigen? Wie sollen wir anhand dieser 10 Zeilen einen Fehler entdecken wenn wir die aufgerufenen Funktionen aber garnicht kennen...
    Und doch, es macht einen gewaltigen Unterschied. Das sagte man dir aber schon mal: http://www.forum-raspberrypi.d…ngen?pid=196243#pid196243


    Du hast recht ... hier der rufende Teil (
    [PHP]


    from time import *
    import threading
    global RasPi
    #
    from PlantServiceXsub_3b import *


    if sys.platform.startswith('linux2') :
    import RPi.GPIO as GPIO
    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    RasPi=True
    else :
    RasPi=False
    print('started not on RasPi, started at ',sys.platform)


    P_DEBG = False


    stop = False


    def task1 (DELY) :
    global P_DEBG, stop
    while not stop : # do something
    t=localtime()
    if P_DEBG : print ('Task1: dely=','%04i' % DELY,' time= ',
    '%02i:' % t.tm_hour,
    '%02i:' % t.tm_min,
    '%02i' % t.tm_sec)
    sleep(DELY)
    if P_DEBG : print ('task1 stoping')
    return


    def task2 (DELY) : # blinktest
    global P_DEBG, stop, RasPi
    led_state = False
    if RasPi :
    LED=27
    import RPi.GPIO as GPIO
    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    GPIO.setup (LED,GPIO.OUT)
    GPIO.output(LED,led_state)
            
    while not stop : # do something
    t=localtime()
    if P_DEBG : print ('Task2* dely=','%04i' % DELY,' time= ',
    '%02i:' % t.tm_hour,
    '%02i:' % t.tm_min,
    '%02i' % t.tm_sec)
    led_state = not led_state
    if led_state : dely=0.02
    else : dely=3.00
    if RasPi :
    GPIO.output(LED,led_state)
    else :
    print ('.',end='')
    sleep(dely)
    if P_DEBG : print ('task2 stoping')
    return


    def task3 (DELY) :
    global P_DEBG, stop
    while not stop : # do something
    t=localtime()
    if P_DEBG : print ('Task3# dely=','%04i' % DELY,' time= ',
    '%02i:' % t.tm_hour,
    '%02i:' % t.tm_min,
    '%02i' % t.tm_sec)
    sleep(DELY)
    if P_DEBG : print ('task3 stoping')
    return


    if True :
    t2 = (0.5,)
    th2=threading.Thread(target=task2, args =(t2))
    print ('blink thread initialized')
    #sleep(20)
    th2.start()
    print ('blink thread started')
    print ('th2:',th2)
    th1=threading.Thread(target=plant_service(), )
    print ('plant thread initialized') # <<<<<<<<<<<<<<<<< diese Zeile wird nicht erreicht
    print ('th1:',th1)
    #sleep(20)
    th1.start()
    print ('plant thread startetd')
    else :
    t1=(1,) # loopdelay
    t3=(2000,)
    th1=threading.Thread(target=task1, args =(t1))
    th2=threading.Thread(target=task3, args =(t3))
    th1.start()
    th2.start()


    print ('********** starting finished **********')
    KeyBoardLoopDelay=1.0
    while True :
    try :
    sleep (KeyBoardLoopDelay)
    except KeyboardInterrupt :
    stop = True
    if P_DEBG : print ('main Crtl-C & stop')
    break
    [/PHP]
    plant_service() zu vollständig zu posten ist .... viel ... aber signalisiere wenn das erforderlich ist. Denke aber das das nicht der Fall sein kann, denn der Interpreter hat ja keine Ahnung "was auf ihn zu kommt" ....


    Das der Restcode vorhin nicht gepostet wurde war aus der Überlegung, das es mit einer anderen Funktion ja funktioniert - kann also kein Fehler sein... oder?


    Gottfried

    Hallo


    Nein, der Umstieg auf threading macht keinen Unterschied.


    Teil des Hauptprogramms:
    [PHP]
    if True :
    t2 = (0.5,)
    th2=threading.Thread(target=task2, args =(t2))
    print ('blink thread initialized')
    #sleep(20)
    th2.start()
    print ('blink thread started')
    print ('th2:',th2)
    th1=threading.Thread(target=plant_service(), )
    print ('plant thread initialized')
    print ('th1:',th1)
    #sleep(20)
    th1.start()
    print ('plant thread startetd')
    [/PHP]
    Wenn man den Code laufen lässt läuft Alles super bis
    th1=threading.Thread(target=plant_service(), )
    da läuft sofort die Funktion plant_service() das sehe ich am Output:


    ich bin ratlos


    Gottfried


    PS.: dasselbe Verhalten mit Python 3.4.3 in Win32


    Kein Problem :) . Es kommt nur häufiger vor, dass Leute eine Fehlermeldung posten und dann um Hilfe fragen. Dabei ist es sehr häufig ausreichend genau den Fehlertext einer Suchmaschine zum Frasse vorzuwerfen (vor natuerlich individuelle Infos wie IPs usw entfernen). Diese Empfehlung gebe ich dann immer gerne. Natürlich kommt es dann aber auch wie bei Dir vor dass man dann die gefundene Information nicht versteht :)


    PS: Finde ich gut dass Du Deinen fertigen Code noch mal für die Allgemeinheit gepostet hast :thumbs1:



    Danke - aber hier gibt es keine Sektion wie "Codeschnipsel" oder so...?


    Jedenfalls Danke für Eure Hilfe


    OK, interessant...
    Nur zur Erinnerung. Das script soll automatisch nacht Power-Up-starten : also in rc.local
    "sudo idle3 -r python_program.py" .... ?


    Was muss ich dazu installieren?
    https://github.com/Christophe31/screenutils oder
    apturl oder ... bitte um einen Hinweis. als schlichter Mensch den Unix nich mit der Muttermilch bekam stehe ich immer vor der Frage ....und läuft das am Raspi?


    python_program.py schreibt Daten auf den Bildschirm ... wo immer der ist OK


    Wie sehe ich das dann?


    -----------------------------------------------------------------------------------------------


    Sorry ... der ganze Thread ist doch Quatsch von mir - oder? Ich schreibe mit
    python_program.py in eine Datei und die schaue ich mir ab und zu mit VNC an... fertig?


    Stimmt doch? od(e)r?


    Gottfried

    Danke Euch


    @famp
    "BTW: lmgtfy hilft sehr bei Fehlermeldungen undefined"
    Du hast recht aber ich habe mit dem OOP-Kauderwelsch ein echtes Problem ... sorry

    Hallo,


    ich habe ein sehr sonderbares Problem mit [python 3.2.3] _thread.start_new_thread(...)


    Ein "Basisprogramm" startet 2 Threads (Funktionen) mit einfachen Dingen (Test wie Blinken, Zeit ausgeben etc.) ...


    Code
    t1=(0.3,)
    t2=(1.2,)
    _thread.start_new_thread(task1, (t1))
    _thread.start_new_thread(task2, (t2))
    print ('***starting finished***')


    ...alles super, das Programm läuft über die _thread.start_new_thread(...) - wie es soll - hinweg und das Hauptprogramm macht auch seine Arbeit. ***starting finished*** wird ausgegeben So weit so gut.


    Nun hänge ich statt einer Testfunktion die wirklich für mich interessante Funktion ein

    Code
    t1=(0.3,)
    t2=(1.2,)
    _thread.start_new_thread(true_task, (t1))
    _thread.start_new_thread(task2, (t2))
    print ('***starting finished***')


    ... das Programm startet diese Funktion "true_task" und die Funktion arbeitet brav und bieder... aber "task2" wird nicht gestartet.


    Ändere ich die Reihenfolge:

    Code
    t1=(0.3,)
    t2=(1.2,)
    _thread.start_new_thread(task2, (t2))
    _thread.start_new_thread(true_task, (t1))
    print ('***starting finished***')


    Startet "task2" und "true_task" aber das Hauptprogramm läuft nicht weiter.



    Nun ist der Hauptverdächtige "true_task" - was macht "true_task" (das ist eine umfangreiche Funktion die Daten erfasst steuert). CPU Last 12% und zum Schluss ein sleep(etwa 1800). Ich denke da ist nichts Schlimmes. Das Einzige, etwas außergewöhnliche, ist dass diese Funktion beim Start mit os.system ein Python2 Programm startet (weil es den DHT22 Modul in Python3 nicht gibt). Aber auch das ist nicht verwerflich und wird auch nicht mit dem Scheiterhaufen geahndet...oder? Die ganze Schleife in "true_task benötigt 3sec Rechenzeit und fertig.


    Also im wesentlichen ist true_task

    Code
    setup
    init
    os.system('sudo python DHT22#loop.py 22 24 100  > DHT22#loop.txt &')
    while True:
         messe vor dich hin
         schallte ein und aus
         sleep(1759.534)
    ...


    Bitte um einen Expertenrat


    Gottfried


    PS.: wenn ich den System-call herausnehme ändert sich nix