Probleme mit Skript

  • Guten Abend,


    kurz zur Hardware und meinem Vorhaben. Ich betreibe einen Raspberry 3 B+ mit dem original 7" Touchscreen inkl. Gehäuse und Raspbian Stretch lite. Darauf soll ein rstp Stream einer Kamera angezeigt werden. Um den Stromverbrauch zu reduzieren und die Lebensdauer des Displays zu verlängern möchte ich gerne das die Hintergrundbeleuchtung beim antippen für 1min an geht und sich dann wieder abschaltet.

    Für die zeitgesteuerte Abschaltung des Displays hab ich folgendes Skript installiert https://github.com/timothyhollabaugh/pi-touchscreen-timeout 

    Zur Wiedergabe des Streams den omxplayer.

    Starten wollte ich bis jetzt alles mittels rc.local.

    Code
    /home/pi/pi-touchscreen-timeout/timeout 10 event0 &
    omxplayer --win "0 0 800 480" rtsp://192.168.3.58:554/11

    Jede Zeile für sich, einzeln, beim Boot geladen funktioniert super. Sobald beide Zeilen in der rc.local sind lässt sich der Bildschirm 1-2 mal innerhalb der ersten 30s nach boot wieder bei Berührung erhellen. Danach reagiert der Raspberry nicht mehr. Login und Reboot via Putty ist noch möglich.

    Ich hoffe hier habt Lösungsansätze oder Tips nach was ich im Netz suchen könnte. Es kann ja nur noch eine Kleinigkeit sein, an welcher ich leider seit 3 Abenden hänge :S

    Vorab vielen Dank und ein schönes Wochenende,

    sunwalkerr

  • Hallo hyle,


    danke. Ich habe es grad getestet. Leider das gleiche Resultat. Ich sehe den Start des Skript´s, dann lädt der Stream. Dann geht nach einigen Sekunden die Hintergrundbeleuchtung aus, bei Berührung geht diese wieder an. Das klappt dann max. noch ein zweites mal und dann bleibt das Display dunkel. :conf:

    Bin zwar in Sachen Linux noch recht grün hinter den Ohren. Hatte in der Vergangenheit mal ein Webradio Player mit Steuerung via Webinterface, eine Zeit lang XMBC und openHabian am laufen. Aber alles nur mittels Anleitungen und fertigen Scripts.

    Laut top liegt die CPU Auslastung bei bei max. 3%. Timeout und omxplayer sorgen jeweils für etwa 0,3% CPU Auslastung.

    • Official Post

    Mangels Erfahrung mit dem Display kann ich leider nicht viel dazu beisteuern... Vielleicht liegt es am Skript für die zeitgesteuerte Abschaltung der Hintergrundbeleuchtung. :conf:


    Btw. Linus hat https://github.com/linusg/rpi-backlight entwickelt, das könnte auch etwas Sinnvolles für Dich sein. ;)

  • Hab mir gerade die readme angeschaut. Super Beschreibung und sieht sehr vielversprechend aus. 1000 Dank für den Tip. :thumbup::bravo2:

    Werde es morgen Abend Mal testen und berichten.

    Bis dann und schonmal ein schönes Wochenende

  • So da wäre ich wieder. Also das Programm von Linus finde ich sehr cool. Das fade-out und fade-in der Helligkeit wirkt wesentlich eleganter und wertiger als ein hartes on/off.

    Da wäre für mein Vorhaben schöne wenn ich von 70% in 4s auf 11% dimmen könnte und dann die Beleuchtung aus geht. Bei Berührung soll sie auf 11% an gehen und binnen 1s auf 70% hoch regeln. Parameter könnten ja je nach Umgebung anpassen.

    Leider biete das Programm keine Möglichkeit der Zeit gesteuerten Abdunklung, bzw. wieder Einschalten nach Berührung des Displays.

    Ist da eine einfache Möglichkeit via Skript oder so machbar? :conf:

    Ist komplettes neuland für mich und ich wüsste nicht wo und wie ich da ansetzen soll. :shy::helpnew:

  • Leider biete das Programm keine Möglichkeit der Zeit gesteuerten Abdunklung

    Von welchem Programm sprichst du? Mein rpi-backlight besteht aus drei Komponenten: Python-API, CLI-Tool und GUI (im Grunde nur ein Slider).


    Touch/Klicḱ-Events musst du selbst feststellen, das ist nicht Bestandteil des Projekts (ich lasse mich aber gerne überreden, das noch mit einzubauen). Ich denke Außerdem darüber nach, die Helligkeit zu normalisieren (wenn ich das Richtig in Erinnerung habe, sind Werte unter 10 oder 11 nicht möglich, aber 100 ist auch nicht das Maximum. Ich fänd's besser, wenn 0 die geringste Helligkeit einstellt und 100 die höchst mögliche. Das nur am Rande.


    Was meinst du mit zeitgesteuerter Abdunklung? Wenn du "Uhrzeit" meinst -> Suche nach Cronjob.


    Ich habe leider gerade kein Display da, weil ich mein letztes unbeabsichtigt kaputt gemacht habe, aber ich denke, ich sollte mir als Entwickler des Projekts mal wieder eins kaufen :lol:

  • Hallo Linus,

    ja ich meine das von dir geschriebene und von hyle empfohlene rpi-backlight. Danke dafür schonmal für die tolle Arbeit.

    Kurz zum genaueren Hintergrund (optional):

    Aktuelles Raspian stretch lite. RTSP öffne ich via omxplayer. Erstes Script von https://github.com/timothyhollabaugh/pi-touchscreen-timeout. Beides ausgeführt über die rc.local. Resultat war folgendes

    Jede Zeile für sich, einzeln, beim Boot geladen funktioniert super. Sobald beide Zeilen in der rc.local sind lässt sich der Bildschirm 1-2 mal innerhalb der ersten 30s nach boot wieder bei Berührung erhellen. Danach reagiert der Raspberry nicht mehr. Login und Reboot via Putty ist noch möglich.

    Dann habe ich den Tip von hyle, aus Post #2, ausprobiert. Leider mit dem gleichen Resultat. Und hyle hat mir den Programm empfohlen. Also heute Phyton installiert und dein Programm. Funktionen über die shell sind alle sehr gut und begeistern mich.

    Ich denke über die shell hab ich Python-API benutzt :conf: GUI vermutlich ich mal für die Desktop Varianten von Raspbian? Korrigiere mich bitte wenn das flasch ist :shy: CLI-Tool sagt mir garnichts :denker:

    Jetzt wie ich es gern umsetzen würde. Da der Bildschirm ja nur bei Interesse, z.B. wenn es klingelt, auf dem Weg zur Tür kurz genutzt wird. Sollte die Hintergrundbeleuchtung standartmäßig deaktiviert sein. Beim Antippen des Touchscreens soll die Beleuchtung an gehen und nach x Sekunden wieder aus. :daumendreh2: Am schönsten dann mit einem fade-in von 1s und und einem fade-out von 4s, was dein Programm ja super macht :bravo2:

    Gibt es vielleicht ein, im Idealfall kommentiertes, Script. Mit ähnlicher funktion wo ich mich etwas ableiten oder rausziehen kann. Gerne auch Tips mit Basics zur Erstellung solcher Scripts, falls es sowas gibt und ihr zufällig nen Link zur Hand habt. :geek:


    So genug von mir für heute. Ich hoffe das war nicht zu viel auf einen Schlag.

    Allen einen schönen Sonntag und schonmal vielen Dank für euren tollen Support.

  • GUI vermutlich ich mal für die Desktop Varianten von Raspbian?

    Richtig. Betrifft dich also nicht, wenn du Raspbian Lite verwendest.


    CLI-Tool sagt mir garnichts :denker:

    CLI steht für Command Line Interface, und beschreibt allgemein Programme, die kein Fenster öffnen, sondern im Terminal ausgeführt werden müssen. Und wenn deiner Beschreibung nach hast du wohl das Python-API verwendet.

    Jetzt wie ich es gern umsetzen würde. Da der Bildschirm ja nur bei Interesse, z.B. wenn es klingelt, auf dem Weg zur Tür kurz genutzt wird. Sollte die Hintergrundbeleuchtung standartmäßig deaktiviert sein. Beim Antippen des Touchscreens soll die Beleuchtung an gehen und nach x Sekunden wieder aus. :daumendreh2: Am schönsten dann mit einem fade-in von 1s und und einem fade-out von 4s, was dein Programm ja super macht :bravo2:

    Gut beschrieben, jetzt verstehe ich es. Ich kann gerne versuchen, ein Script zu schreiben - ich hoffe einfach mal, "Touch" wird als "Klick" interpretiert. Testen kann ich es wie gesagt gerade nicht, das musst du dann übernehmen.

  • Das wäre sehr nett :angel:

    Test übernehme ich sehr gerne. Wird aber meist zu den Abend-Stunden. Tags über ist Family Zeit :^^:

    Mit ausführlichem Feedback :shy:

    Dann freue ich mich schon auf den ersten Test :@

  • Also dann:

    • INPUT_DEVICE_PATH musst du mit dem Pfad zur Gerätedatei des Touchscreens ersetzen Wie du das heraus findest, steht hier: https://python-evdev.readthedocs.io/en/latest/tutorial.html
    • TIMEOUT ist in Sekunden, kannst du natürlich anpassen. Sobald ein Klick (= "Touch", hoffentlich) erkannt wird, wird display_on aufgerufen, 5 Sekunden später (+-0,1s, kannst du natürlich ebenfalls anpassen) dann display_off - oder es wird vorher wieder ein Klick erkannt, dann wird wieder von 5 Sekunden herunter gezählt. Sollte klar sein.
    • Der Code läuft unter Python 3.5 oder höher - kein Problem, da auf Raspbian standardmäßig installiert. Du musst noch mit pip3 install --user evdev das Modul evdev installieren. Dafür wiederum Musst du mit apt die Pakete python3-dev und python3-pip installieren.
    • Ausführen musst du das script als Root, oder als ein User, der in der Gruppe input ist.
    • Der Code verwendet asyncio, was nicht jedermanns Sache sein mag, aber ansonsten nichts dramatisches. OOP, einfache Schleifen und if-Abfragen kann man alles in der Python-Doku nachlesen.
    • self.input_device.async_read_loop() ist ein endloser Iterator, der praktischerweise immer "pausiert", bis es ein neues Event zum verarbeiten gibt. Nebenbei läuft eine Endlosschleife, die die Zeit des letzten Klick-Events mit der aktuellen Zeit vergleicht.
    • Beenden kannst du das Programm wie üblich mit Ctrl+C, ansonsten läuft es endlos - kann also beim Systemstart gestartet werden und verrichtet dann im Hintergrund seinen Dienst, ohne dabei viele Resourcen zu verbrauchen.

    Ich weiß nicht, wie gut dein Python-Wissen ist, daher habe ich auf Kommentare zunächst ganz verzichtet. Gehe es einfach Zeile für Zeile durch, das meiste ist einfache Logik. Wenn du dann eine Zeile auch mithilfe der entsprechenden Doku nicht verstehst, kannst du gerne nachfragen.

  • So jetzt kann es los gehen. Das war ja schnell gemacht von dir. Dachte das dauert etwas.


    Meine Kenntnisse in Phyton sind <=0,5% :conf: Kann ein klein wenig AWL auf ner S7. Aber auch nur aus nem Grundkurs. Das ein oder andere kann ich mir anhand der Wörter ableiten und in Logiken kann ich mich, wenn ich das drum herum verstehe, reindenken bzw. mir vorstellen was passiert. Einfach ausgedrückt bin ich ein 34 Jahre altes/junges Skript-Kidy :stumm:


    Die beiden Pakete python3-dev und python3-pip habe ich installiert. Mit den Tuts aus dem Link in Punkt 1 kann ich jedoch leider nichts anfangen. Müssen die Befehle in ein Skript und ausgeführt werden? Wenn die befehle in der Shell ausführe bekomme ich nur -Bash Fehlermeldungen. Aber ich vermute das der Touch-input /dev/input/event0 ist? Das wird als "device like" in der Readme, des zuerst von mir probierten Skripts erwähnt.


    Ich habe, einfach um zu schauen ob ich überhaupt ein Skript so einfach laden kann, wie ich es mir vorgestellt habe folgendes probiert.

    In einem ordner eine Datei namens rpi_script.py erstellt. Dort rein hab ich deinen Code eingefügt und gespeichert. Mittels sudo python3.6 rpi_script.py habe ich diese ausgeführt und folgende Ausgabe erhalten

    Python
    Traceback (most recent call last):
      File "rpi_script.py", line 4, in <module>
        from evdev import InputDevice, ecodes
    ModuleNotFoundError: No module named 'evdev'

    Ich habe doch pip3 install --user evdev installiert :conf:

    Code
     pip3 install --user evdev
    Collecting evdev
      Downloading https://www.piwheels.org/simple/evdev/evdev-1.1.2-cp35-cp35m-linux_armv7l.whl (91kB)
        100% |████████████████████████████████| 92kB 855kB/s
    Installing collected packages: evdev
    Successfully installed evdev-1.1.2


    Bzgl des Verständnisses zum Code. Soll ich mal Kommentare hinter die einzelnen Zeilen einfügen, mit dem was ich denke was sie machen? Dann kannst du dir ein Bild davon machen, was ich davon verstehe :daumendreh2: aber nicht :auslachen:

    Edited once, last by sunwalkerr: Konnte das Script doch ausführen. ().

  • Mit den Tuts aus dem Link in Punkt 1 kann ich jedoch leider nichts anfangen. Müssen die Befehle in ein Skript und ausgeführt werden? Wenn die befehle in der Shell ausführe bekomme ich nur -Bash Fehlermeldungen

    Du öffnest eine Python-Shell, indem du im Terminal python3 ausführst. Eine Python-Shell erkennst du immer an den >>> . Immer wenn du das siehst, weißt du, du musst das darauffolgende in einer Python-Shell ausführen, also einfach kopieren und einfügen, ohne den Prompt (>>> )

    Ich habe doch pip3 install --user evdev installiert :conf:

    Das sieht schon gut aus. Dann deinstalliere es mal wieder (pip3 uninstall evdev) und installiere mal ohne --user. Ich verwende immer "virtual environments", weswegen ich da etwas eingerostet bin, wie das ohne ist.

    Bzgl des Verständnisses zum Code. Soll ich mal Kommentare hinter die einzelnen Zeilen einfügen, mit dem was ich denke was sie machen? Dann kannst du dir ein Bild davon machen, was ich davon verstehe :daumendreh2: aber nicht :auslachen:

    Klar, das klingt vernünftig. Oder du fügst die Zeilen als Zitate hier im Forum ein, etwa so:

    INPUT_DEVICE_PATH = "/dev/input/event3"

    Kommentar/Frage 1...

    loop = asyncio.get_event_loop()

    Kommentar/Frage 2...


    Wie es dir lieber ist.

  • Du hast evdev als user pi installiert. Du rufst das Skript mit sudo auf, das bedeutet das Skript läuft unter user root. Unter user root gibt es kein modul evdev.


    Edit: Linus war schneller

  • Du hast evdev als user pi installiert. Du rufst das Skript mit sudo auf, das bedeutet das Skript läuft unter user root. Unter user root gibt es kein modul evdev.

    Das ist nicht zwingend richtig. Ich hab's eben mal unter Linux Mint, ohne venv getestet:


    Bash
    $ pip3 install --user evdev
    ...
    $ ls -la /home/linus/.local/lib/python3.6/site-packages/evdev
    total 268
    ...
    $ sudo python3 -c "import evdev"
    [sudo] password for linus:          
    $ echo $?
    0
    $

    Aber wie gesagt, sehr gut möglich, dass das unter Raspbian anders ist... Alles eine Frage des PYTHONPATHs:


    (unbearbeitet)

    Bash
    $ sudo python3
    Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
    [GCC 8.2.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.path
    ['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/home/linus/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages', '/usr/lib/python3.6/dist-packages']
    >>> 
  • :geek: Ok, das hat mich schon mal einige Schritte weiter gebracht. evdev ist ohne --user installiert :thumbup:

    Listing accessible event devices liefert:

    Code
    /dev/input/event0 FT5406 memory based driver

    Jetzt hängt der Code hier:

    Code
     File "rpi_script.py", line 31
        async def wait_for_event(self):
                ^
    SyntaxError: invalid syntax


    Ich denke wenn ich im Notepad++ kommentiere ist für mich übersichtlicher. Wenn ich es dann als Code hier einfüge ist es übersichtlicher im Post. Werde gleich damit anfangen. Im moment versuche ich learning by doing. Zugegeben das meiste doing kommt bisher von deiner Seite :shy:


    Update:

    Wollte den Hinweis von kle ausschließen und hab evdev nochmals deinstalliert und mittels sudo als root installiert. Bekomme aber den gleichen SyntaxError.

    Edited 2 times, last by sunwalkerr: Update ().

  • Jetzt hängt der Code hier:

    Das passiert, wenn man den Code mit mit einer Python-Version niedriger als 3.5 ausführt, native coroutine kamen da in Python dazu - deswegen schrieb ich das extra dazu.


    Wie genau rufst du das Script in dem Fall auf? Die genaue Python-Version kannst du mit python -V herausfinden - z.B.:

    Bash
    $ python -V
    Python 2.7.15rc1
    $ python3 -V
    Python 3.6.7
    $ 
  • :wallbash: Hatte es mit sudo python rpi_script.py probiert

    Mit sudo python3 rpi_script.py gibt es keine Fehler mehr :lol:

    Aber am Display tat sich nichts.

    Beim Verlassen mittels Strg+c gab es folgende Ausgabe:

  • Hallo,


    Quote

    Beim Verlassen mittels Strg+c gab es folgende Ausgabe:

    Macht nix. Das besagt nur, dass zwei Task beendet wurden, die nicht fertig waren. Da die beiden Tasks aber endlos laufen, ist das normal.


    Gruß, noisefloor

  • Aber am Display tat sich nichts.

    Vermutlich musst du diese Zeile nun an das Display anpassen: if event.code == ecodes.BTN_LEFT and event.value == 1:


    Das würde schon Sinn machen, wenn ein Touch-Event nicht als BTN_LEFT erkannt wird. Ich habe ein Grundgerüst geliefert, es ist nun an dir, ein wenig damit zu experimentieren - indem du z.B. print(event) zwischen Zeile 32 und 33 einfügst.