Posts by noisefloor

    Hallo,


    absehen von den rechtlichen Bedenken, die ich teile: es gibt AFAIK keine fertige Lösung. Sprich wenn du das mit dem Raspi (oder einem Mikrocontroller wie ESP32 oder so) umsetzen möchtest, wirst du dich zwangsläufig zumindest mit den Grundlagen der Hardware sowie wie man ein Python-Programm (oder welche Sprache auch immer) ans Laufen bringt, nach einem Absturz neu startet etc. beschäftigen.


    Da das Projekt jetzt nicht sooo kompliziert ist findest du ggf. auch wenn (Student, Azubi, Freelancer), der dir das Projekt gegen Kohle umsetzt.


    Gruß, noisefloor

    Hallo,


    Quote

    Ich habe mod_rewrite aktiviert und nichts weiter konfiguriert. - Liegt hier der Fehler?

    Mir ist zwar nicht ganz klar, was wie wo warum nicht funktioniert, weil deine Beschreibung ein bisschen dünn ist...


    mod_rewrite ist jedenfalls keine Lösung für einen Zugriff von außen, weil damit Request, die bei Server ankommen, lokal auf dem Server umgeschrieben werden, z.B. von IP_DES_SERVER/foo auf IP_DES_SERVERS/bar


    In der Standardkonfiguration sind viele Server (Apache, nginx, ...) so gerne vorkonfiguriert, dass sie "nur" auf localhost / 127.0.0.1 lauschen. Wenn der Server an eine andere IP-Adresse gebunden werden soll, dann musst du das in der entsprechenden Konfigurationsdatei des Server ändern.


    Gruß, noisefloor

    Hallo,


    wenn du Java lernst: warum muss das unbedingt auf dem Pi sein und nicht auf deinem "normalen" PC, den du ja scheinbar auch besitzt?


    Gruß, noisefloor

    Hallo,

    da ich gerade Java lerne, frage ich mich ob es auf dem Raspberry so vorteilhaft ist mit Java zu arbeiten. Man liest viel über Python (habe ich mir angeeignet), aber kaum was über java.

    Es kommt darf an, was du machen willst. Grundsätzlich ist der Raspberry Pi ja auch "nur" ein Computer wie jeder andere. D.h. jede Programmiersprache, für die es ein Paket gibt bzw. die du im Zweifelsfall selber auf dem Pi kompilieren kannst, läuft.

    Ob das sinnvoll ist oder nicht hängt von vielen Faktoren ab, die wir nicht kennen. Der Pi hat halt ein begrenzte Leistung. Wenn es z.B. für Sprache $FOO sinnvoll ist, eine "große" IDE zu nehmen, kann das auf dem Pi halt ggf. zäh werden.

    Wenn du irgendwas programmieren willst, wo du die GPIO brauchst, sollte es für die Sprache $FOO eine gute Bibliothek zum Ansteuern der GPIOs geben.

    Und es ist auch die Frage, was du wie tief lernen willst. Wenn man mit Python auf dem Raspi ein Programm schreiben kann, dass mit den GPIOs und daran hängten Sensoren und Aktoren kommuniziert, heißt das ja auch noch lange nicht, dass man z.B. mit Python auch eine Webanwendung oder ein gutes Programm mit Nutzerinteraktion schreiben kann.


    Gruß, noisefloor

    Hallo,


    also rc.local ist total veraltet und existiert nur noch aus Gründen der Rückwärtskompatibilität. Stand der Dinge zum Starten von Skripten im Hintergrund ist systemd und eine systemd Service Unit.


    Zum Problem: mit `pip3 install ...` wird das Python-Modul normalerweise "nur" für den ausführenden Benutzer (also per Default der Nutzer `pi`) installiert, nicht systemweit (was prinzipiell gut ist). Wenn du dein Skript mit `sudo` ausführst bekommt es Root-Rechte - für Root ist das Modul aber nicht installiert, ergo der Fehler.

    Wenn das Skript nicht aus anderen Gründen zwingend Root-Rechte braucht solltest du es auch nicht mir Root-Rechten ausführen. Wenn du das Skript automatisch über eine systemd Service Unit startest, dann kannst du in der Unit festlegen, unter welchem Nutzer das Skript ausgeführt wird.


    Quote

    PS: Das folgende hab ich bereits oben in meine Datei geschrieben geht leider trotzdem nicht

    Hat mit deinem Problem auch nichts zu tun.


    Gruß, noisefloor

    Hallo,


    also die Fehlermeldung sagt, dass da "nur" ein Signaturschlüssel für eines der Repos fehlt.


    Abgesehen davon ist es fragwürdig, wie sinnvoll es ist, ein Repo, was speziell für Ubuntu gemacht ist und dazu noch für eine Ubuntu Version, die EOL ist, in Raspbian OS einzubinden.


    Um Repos zu entfernen muss du die entsprechenden Zeile aus der Datei `/etc/apt/sources.list`entfernen. Je nach Konfiguration kann das Repo auch via einer Datei unterhalb von `/etc/apt/sources.list.d/`eingebunden sein.


    Gruß, noisefloor

    Hallo,


    Quote

    Also wenn eine bestimmte Uhrzeit ist soll das passieren was "Start" aktuell ausführt.

    `Start`führt bei dir aber gar nichts aus... `Start` ist bei dir eine Variable, an die ein Integer-Wert gebunden ist.


    Quote

    Die Vorübergehenden Merker (GPIO 24-25)... ich weiß nicht ob ich die in diesem Skript noch verwenden werden aber

    "Merker" ist eine schräge Bezeichnung... Sowas gibt es im Python-Kontext nicht. Es gibt "nur" Variable. Das tolle bei Skripten ist ja, dass man dies mit einem normalen Editor editieren kann, sprich Zeilen löschen und hinzufügen. Und wenn man das Skript (neu) startet werden die neuen Zeilen mit ausgeführt.


    Gruß, noisefloor

    Hallo,


    Quote

    Oder ist die Disskussion eher akademisch und für mich, zumindest momentan, nicht von Belang?

    Python hat eine Build-In Funktion namens super.

    Die Kurzfassung ist: die braucht man fast nie, man findet im Netz viele Beispiele, wo sie falsch gewendet wird und bei der Verwendung kann man einiges falsch machen. I.d.R. reicht es, selbst für fortgeschrittene Programmierer, dass man weiß, dass es sowas gibt.


    Gruß, noisefloor

    Hallo,


    Quote

    ich bin niur halb so blöd, wie du glaubst!

    Hm... das ist aber eine ungeschickte Aussage. Sagen wir mal - so rein hypothetisch und natürlich völlig grundlos und ungerechtfertigt - dich hält jemand für unendlich blöd. Dann ist die Hälfte immer noch ...


    Und nein, if leitet nie eine Schleife ein. Die Schleife kann frühsten eine Zeile später kommen. Hat dann aber nicht wirklich mehr was mit der if-Bedingung zu tun.

    Das interessante dabei, dass glaube ich noch nie jemand geschrieben hat, dass es ein Problem mit der else-Schleife gibt ;)


    Gruß, noisefloor

    Hallo,


    Quote

    Ich hätte es gerne das er die Schleife abbricht wenn der Taster seinen Zustand währenddessen ändern sollte.

    Grunssäzlich läuft ein Programm, also jedes Programm, egal welche Sprache, erst mal linear durch, d.h. es wird Zeile für Zeile abgearbeitet. Wenn man Sachen (quasi-) Parallel machen will, braucht man nebenläufige Programmierung (z.B. Threading, Multirprocessing, ... etc).

    Wenn die Plattform das nicht bietet - was AFAIK bei vielen Mikrocontrollern der Fall ist - muss man sich halt selber drum kümmern, dass der Zustand im Hauptprogramm immer wieder abgefragt wird und dann der Programmablauf entsprechend geändert wird.


    Ansonsten solltest du vielleicht mal konkreter Beschreiben, was aktuell passiert und was du gerne ändern würdest, am besten mit realem Code. Dann kann man besser helfen. Aktuell ist das alles ja ein bisschen abstrakt.


    Gruß, noisefloor


    P.S.: if ist eine Bedingung, keine Schleife. Schleifen sind z.B. for, while, do ... while.

    Hallo,


    der Code ist doch fast passabel...


    • `global`will man normalerweise nicht benutzen, weil es den Zustand des Programms unübersichtlich und schwer bis nicht nachvollziehbar macht. Funktionen übergibt man Parameter explizit. Machst du an den meisten Stellen ja.
    • Keine kryptischen Variablennamen benutzen k, s und t , sondern aussagekräftige Namen. Sonst ist der Code schwer verständlich.
    • `os.system` ist veraltet, das steht sogar wörtlich in der Python-Doku. `subprocess` ist das Modul der Wahl

    So


    Python
    def box_item(app,bg,height,width,align,border,lo):
        ...
        if bg != "":
            box.bg = bg
        ...

    macht man das nicht, sondern:

    Code
    def box_item(app,bg=None,...):
        ...
        if bg:
            box.bg = bg
        ...

    Also Argumente vorbelegen, wenn nicht zwingend was übergeben werden soll.


    Gruß, noisefloor

    Hallo,


    bug-reporter : rc.local ist schon länger tot, das willst du nicht mehr benutzen. Das existiert noch noch aus Gründen der Rückwärtskompatibilität und wird von systemd ausgeführt. Stand der Dinge ist schon länger ein Skript per systemd Service Unit auszuführen.


    Ein Skript im Hintergrund ausführen und die Ausgabe der print-Funktion sehen zu wollen ist ein Widerspruch in sich... Wenn du eine Ausgabe brauchst, dann sollte das Skript das in eine Log-Datei schreiben. Python hat dafür das Logging-Modul an Bord, damit ist das einfach umzusetzen.


    Gruß, noisefloor

    Hallo,


    Quote

    Gibt's eine "bessere" GUI Library für meine Zwecke, die auch in angemessener Zeit erlernbar ist?

    GUI-Programmierung ist halt nicht einfach. Unter Python sollte man sich schon zumindest grundlegend mit Objektorientierung, Klassen, deren Methoden und Instanzen auskennen. Außerdem laufen GUI-Programme i.d.R. nicht-linear, d.h. der Mainloop der GUI kontrolliert, wann was / wer dran ist. Das ist gerade für Anfänger manchmal verwirrend, bis man das geblickt hat.


    Klar gibt es Frameworks, die das auf einen höheren Level weg abstrahieren - aber dafür kommt man dann relativ schnell an anderer Stelle an Grenzen, wie du festgestellt hast.


    Die gängigen Frameworks, die auch unter Python genutzt werden, sind Tkinter, Qt und bis zu einem gewissen Grad auch GTK.

    Welches für dich am besten ist, ist schwierig zu sagen, weil wir den Umfang und das genaue Ziel deines Projekts kennen.


    Gruß, noisefloor

    Hallo,


    du weißt aber schon, dass Python + CGI seit > 10 Jahren obsolet ist und man das nur als allerletzten Notnagel benutzt? Stand der Dinge ist Python-Applikationen via WSGI auszuführen. I.d.R. via WSGI-Applikationssserver wie z.B. gunicorn. Und man verwendet ein WSGI-kompatibles Framework wie z.B. Flask oder Bottle oder Django. Klingt kompliziert - ist es aber nicht. Jedenfalls ist quasi alles besser als CGI.


    Gruß, noisefloor


    P.S.: dem im 1. Post verlinkten Tutorial würde ich auch nicht wirklich trauen - es nämlich kein Ubuntu 18, 19 oder 20...

    Hallo,


    also mit der Zeile Zeile <img id="welcome" src="welcome.png" alt="Begrüßung"> wird das Bild im Document-Root des Webservers erwartet. Document-Root ist bei dir via Reverse-Proxy auf `http://192.168.200.2/`. Da wird die Anfrage dann hin durchgereicht, wobei da dann auch das Bild auch im Document-Root liegen sollte bzw. "irgendwas" auf der IP-Adresse lauschen sollte, so dass `http://192.168.200.2/BILDNAME.jpg` auch `BILDNAME.jpg` zurück liefern sollte.


    Welchen Fehler bekommst du, wenn du auf dem Client den Quelltext der Webseite aufrufst und dann auf den Link des Bild im Quelltext bekommst. Bekommst du `404 not found`?


    Gruß, noisefloor

    Nachtrag: habe es gerade auf meinem Pi Zero ausprobiert, funktioniert. Python Version ist 3.7.3:


    Die komplette Ausgabe kann ich leider nicht posten, weil die Länge eines Forenposts wohl auf 50.000 Zeichen begrenzt ist - die Ausgabe ist aber länger.


    Gruß, noisefloor

    Hallo,


    bei mir auf dem Pi Zero braucht gpiozero auch spürbar lange, um importiert zu werden. Meine _Vermutung_ ist, dass gpiozero wesentlich mehr beim importieren instanziert / initialisiert.


    Stören tut's mich nicht, weil a) der Pi Zero so oder so "lahm" ist und b) wenn gpiozero einmal importiert ist alles "normal" schnell läuft.


    Wenn du wissen willst, was beim Importieren von gpiozero abläuft -> Quellcode lesen. Oder einen Profiler laufen lassen:


    Python
    >>> import cProfile
    >>> cProfile.run('import gpiozero')


    Gruß, noisefloor