Problem: LEDs am Raspberry Pi über Blynk-app und Python-Code steuern

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
stefanpc81
User
Beiträge: 23
Registriert: Montag 14. Februar 2022, 13:38

__blackjack__ hat geschrieben: Dienstag 15. Februar 2022, 20:14 @stefanpc81:
Du hast da jetzt den Weg über ein Closure gewählt, statt eine Klasse zu verwenden.
Ich habe den Code so geschrieben, wie ich es durch die Beiträge von euch als auch nach meinen (allgemeinen) Programmierkenntnissen für richtig gehalten habe. WAS ich als Closure gewählt habe, habe ich nicht verstanden. Ich bin der Meinung, dass man das Ganze mit einem setInterval() lösen müsste, wäre das ein Lösungsweg bzw. dein Vorschlag ihn als eigene Klasse zu verwenden?
Zum Code von Sirius3, der momentan nicht funktioniert, meine ich, dass der Codeteil

Code: Alles auswählen

def write_virtual_pin_handler(control_leds, pin, value):
    control_leds.isblinking = value == ['1']
das Problem sein könnte, da Blynk vermutlich nur pin und value als Parameter annimmt und mit dem zusätzlichen control_leds so nicht funktioniert. Das alles behaupte ich jetzt mal so als Laie bzw. blutiger Anfänger ;-)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mit control_leds hat das nichts zu tun. Sondern der Frage, was pin und value denn genau sind. Kannst du die mal mit print ausgeben, und hier zeigen?
stefanpc81
User
Beiträge: 23
Registriert: Montag 14. Februar 2022, 13:38

Hallo,
Das ist ganz einfach ohne das mit print zu zeigen: pin ist der virtuelle pin 1 unter Blynk, welcher den value 0 oder 1 des Buttons in der app hat. Der value ist also mit dem Button im Startzustand = 0, wenn er angetippt wird = 1, ein späteres tippen wieder =0. Also Virtual Pin 1 aus, an ,aus. Oder mit anderen Worten: der Schalter in der app für die LEDs.
Wenn ich trotzdem das mit dem print() posten soll, nochmals Bescheid geben, dann müsste ich den RPi "nochmal zum Leben erwecken".
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na wenn das ganz einfach ist, dann kannst du es ja selbst loesen. Ich hingegen habe keine Ahunng, wie *genau* das aussieht, und davon haengt dann ab, wie man es zum laufen bringt. Das da irgendwas irgendwie den Zustand des Pins repraesentiert - so weit kann ich da schon selbst mitdenken.
stefanpc81
User
Beiträge: 23
Registriert: Montag 14. Februar 2022, 13:38

@__deets__
Entschuldigung bitte, das war nicht so gemeint.

Jetzt zweifle ich schon an mir selber: Der in der 3. Zeile von mir hinzugefügte Code ist doch an für sich nicht verkehrt, oder?

Code: Alles auswählen

def write_virtual_pin_handler(control_leds, pin, value):
        control_leds.isblinking = value == ['1']
        print("Value = ", value, " Pin = ", pin)
Nachdem das Skript gestartet wird kommt zwar wie üblich das Blynk-Logo, aber keine Ausgabe die ich mit print() codiert erwartet hätte, sobald ich in der app auf on/off bzw. 1/0 schalte.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schieb das Print (was an sich gut aussieht) mal über die Zeile darüber. Falls die aus irgendwelchen Gründen hakt & Blynk den Fehler einfach schluckt.

Falls dann immer noch nichts kommt, ist der Händler nicht korrekt registriert. Da wäre dann nochmal interessant, einen handler wie von Blynk selbst angegeben, aufzusetzen. Mit prints. Wenn der geht, dann muss der bessere Ansatz vom Sirius3 leider deren Krepelei weichen.
stefanpc81
User
Beiträge: 23
Registriert: Montag 14. Februar 2022, 13:38

Also, mit Print eine Zeile darüber kommt jetzt wie erwartet folgendes an der Konsole an:

Value = ['1'] Pin = 1
Value = ['0'] Pin = 1
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Aber was liefert

Code: Alles auswählen

print(f"Value = {value!r} Pin = {pin!r}")
stefanpc81
User
Beiträge: 23
Registriert: Montag 14. Februar 2022, 13:38

...das selbe!
stefanpc81
User
Beiträge: 23
Registriert: Montag 14. Februar 2022, 13:38

Mir ist gerade eine Idee gekommen. Fürchterlich peinlich, aber dass die LEDs nicht mehr zum Leuchten gebracht wurden, liegt höchstwahrscheinlich daran, dass die 4 Akkus für den Stromkreis hinter den GPIOs inzwischen fast alle geworden sind... :shock: Tut mir leid, dass ich nicht früher auf die Idee gekommen bin. Ich melde mich morgen, ob es dann hoffentlich doch mit den über Nacht aufgeladenen Akkus mit dem Code funktioniert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Noe, das kann's nicht sein. Denn dann haette das print funktioniert. Der Fehler liegt in Sirius3's Code. Er hat "self.sleep(1)" geschrieben, und das ist falsch. Es muss einfach nur "sleep(1)".
stefanpc81
User
Beiträge: 23
Registriert: Montag 14. Februar 2022, 13:38

Schlechte Nachrichten: Selbst mit aufgeladenen Akkus und der Änderung auf sleep(1) tut sich nach wie vor nichts.
stefanpc81
User
Beiträge: 23
Registriert: Montag 14. Februar 2022, 13:38

Ich habe folgendes nicht verstanden bzw. der "Fachbegriff" für diese Codeschreibweise ist mir nicht bekannt um selbst zu forschen was es damit auf sich hat und ggf. selbst eine Lösung zu finden:

Code: Alles auswählen

        def isblinking(self, value):
                if value:
Ist "isblinking" eine boolsche Variable? Der übergebene Wert "value" ist bool oder bspw. "1"? Zu letzterem siehe auch

Code: Alles auswählen

def write_virtual_pin_handler(control_leds, pin, value):
        print("Value = ", value, " Pin = ", pin)
        control_leds.isblinking = value == ['1']
Die Zuweisung "= value == ['1']" ist mir nicht bekannt. Was soll das bedeuten?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist ein property. Den Begriff kannst du suchen. Und der Ausdruck ist einfach nur eine Zuweisung von einem Wahrheitswert an diese. Das x == y sowas liefert, sollte bekannt sein.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@stefanpc81: `isblinking()` ist eine Methode, Du hast da aber jetzt einen entscheidenden Teil weg gelassen, nämlich den Dekorator, der das dann zu einem Property macht, also ein ”berechnetes Attribut”. Die Methode wird aufgerufen wenn man dem Property etwas zuweist.

Die Zuweisung bedeutet was jede Zuweisung bedeutet: Werte den Ausdruck rechts vom ``=`` aus und weise das Ergebnis dem Ziel links vom ``=`` zu. Also bei ``a = b + c`` wird ``b + c`` ausgewertet und das Ergebnis an `a` zugewiesen, und bei ``a = b == c`` wird ``b == c`` ausgewertet und das Ergebnis `a` zugewiesen. ``==`` ist ein binärer Operator wie andere auch, also wie ``+``, ``in``, ``<``, und so weiter. Da ist nichts besonderes dran.

Code: Alles auswählen

In [79]: 1 + 2                                                                  
Out[79]: 3

In [80]: 1 == 2                                                                 
Out[80]: False

In [81]: a = 1 + 2                                                              

In [82]: a                                                                      
Out[82]: 3

In [83]: a = 1 == 2                                                             

In [84]: a                                                                      
Out[84]: False
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
stefanpc81
User
Beiträge: 23
Registriert: Montag 14. Februar 2022, 13:38

Ok, verstanden. Danke. Dann weiß ich leider auch nicht weiter.
__deets__ hat geschrieben: Donnerstag 17. Februar 2022, 17:36 Schieb das Print (was an sich gut aussieht) mal über die Zeile darüber. Falls die aus irgendwelchen Gründen hakt & Blynk den Fehler einfach schluckt.

Falls dann immer noch nichts kommt, ist der Händler nicht korrekt registriert. Da wäre dann nochmal interessant, einen handler wie von Blynk selbst angegeben, aufzusetzen. Mit prints. Wenn der geht, dann muss der bessere Ansatz vom Sirius3 leider deren Krepelei weichen.
Verstehe ich dich richtig, dass der Code, also "Sirius' Krepelei" (btw: was heißt das? Etwa so viel wie "Krempel"?), einem neuen, hier noch nicht definierten Code weichen soll???
stefanpc81
User
Beiträge: 23
Registriert: Montag 14. Februar 2022, 13:38

Ich musste gerade feststellen, dass ich an zwei Stellen im Code bei "_blink_event" den ersten "_" übersehen hatte. Wen ich das Skript nach dieser Korrektur laufen lasse, startet "Blynk for Python v0.2.6" normal, sobald ich aber den Value über die App auf 1 setze, werden folgende Fehlermeldungen angezeigt:

Value = ['1'] Pin = 1
Exception in thread Thread-1:
Traceback (most recent call last):
File "usr/lib/python3.9/threading.py", line 954, in _bootstrap_inner
self.run()
File "/home/pi/starwars.py", line 36, in run
self.blink(next(active_led))
File "/home/pi/starwars.py", line 40, in blink
GPIO.output(self.leds, [GPIO.HIGH for led in self.leds if active_led == led])
RuntimeError: Number of channels != number of values
Value = ['0'] Pin = 1

Könnt ihr damit etwas anfangen?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Krepelig ist nicht Sirius3 code, sondern Blynks. Und hast du die Fehlermeldung mal gegoogelt, und angeschaut, was die Zeile, in der sie vorkommt, so in der Dokumentation zu bieten hat?
stefanpc81
User
Beiträge: 23
Registriert: Montag 14. Februar 2022, 13:38

Googles Ergebnisse haben mir nicht wirklich weitergeholfen. Du meinst die Dokumentation von Python 3.9? Ich bin Anfänger, wie gesagt, und weiß nicht, wo die steht. Am RPi findet er den Pfad mit der Datei /usr/bin/python3.9/threading.py jedenfalls nicht.
Und zu RuntimeError: Number of channels != number of values
werde ich auch nicht schlau bei Google.
Wenn ich gewusst hätte, dass mein Projekt seit neuestem weder mit C++ noch mit Javascript nicht mehr möglich ist und mit Python so kompliziert ist, hätte ich eher die Finger davon gelassen.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Dokumentation der Fehlerzeile. Das ist die letzte. GPIO.
Antworten