[Projekt] jukebox4kids (Jukebox für Kinder)

  • Und eine ähnliche Frage:


    Seit der Installation vor 2, 3 Wochen hat sich im Git ja schon wieder einiges getan (Respekt!).


    Kann man eine bestehende Installation eigentlich einfach per git updaten oder gilt es hierbei etwas zu beachten?

    Wenn man z.B. anleitungsgemäß die rfid_trigger_play.sh editiert hat, um RFID-Karten mit Kommandos zu belegen - muss man das vorher sichern?


    Viele Grüße,

    Tobi


    p.s.: Bilder von meiner bald fertigen Box kommen auch demnächst!

  • Hi

    Ein Update einfach zu machen ist nicht möglich wenn du in den Orginal datein was geändert hast.


    Wo unterscheiden sich die Daten zwischen meiner Version und der von Micz Flor?


    Wir sind gerade auch dabei eine neue Anleitung zu erstellen. Ich will die ehr wie einen Baum strukturieren und dann aufschlüsseln wie man was wo einfügen kann usw..

    Welche verschiedene Möglichkeiten es gibt uvm. dauert aber noch da ich gerade in anderen Dinge zuhause abarbeiten muss.


    Micz überarbeitet öfters auf Github die Version. Es soll auch ein readonly system werden usw.


    Auf http://phoniebox.de sind sämtliche links auch zu diesem Forum und verschiedene Möglichkeit dargestellt.

  • Hi

    Ein Update einfach zu machen ist nicht möglich wenn du in den Orginal datein was geändert hast.


    OK, soweit verstanden, danke (also eigene Änderungen sichern und nach Update wieder einbauen)


    Wie sieht es aus, wenn man an den originalen (python-, ...) Dateien nichts geändert sondern nur RFID-Karten mit Ordnern verlinkt hat? In dem Fall ist ein Update problemlos möglich? Also die Karten öffnen danach weiter die korrekten Ordner?

  • also die rfid Datein welche du eingefügt hast darfst du dann ja nur nicht überschreiben wenn z.b der übergeordnete Ordner reinkopiert wird.

    Sonst funktionieren die Verlinkungen weiterhin.


    Das Skript prüft nur ob es eine Datei mit dem Rfid code gibt und wenn ja was da hinterlegt ist, wenn nicht vorhanden dann wird eine neue Datei angelegt. Um Man muss dann verlinken.

  • hailogugo

    alte Version hier im Forum heißt zerobutton.py und bei MiczFlor gpio-buttons.py

    wenn man die Versionen nicht (so wie ich) mixt sollte es noch funktionieren. meine Idee war nur, in den alten Beiträgen auf die neueren Versionen (Jessie -> Stretch usw.) zu verweisen.

  • Noch ein kleiner Hinweis zum mitgelieferten Button-Script misc/GPIO-button-sample.py:


    Zunächst ein kleines Lob: Obwohl noch ungetestet markiert, konnte ich die Anleitung (die aktuelle für Stretch) gut nachvollziehen. Das Kopieren nach scripts/gpio-buttons.py und an die eigenen Bedürfnisse anpassen hat grundsätzlich gut geklappt:

    Code
    Make a copy of the python script for the GPIO buttons into the scripts folder. This way you are free to make changes to the script without changing your github repo.
    $ cp /home/pi/RPi-Jukebox-RFID/misc/GPIO-button-sample.py /home/pi/RPi-Jukebox-RFID/scripts/gpio-buttons.py


    Damit am Ende beim Button Drücken auch wirklich was passiert, muss aber noch ein kleinerer Fehler im Script gefixt werden. Die Zeile...

    Code
    def def_next():
    check_call("./scripts/playout_controls.sh -c=playernext", shell=True)

    sowie die 6 vergleichbaren daneben enthalten einen relativen Pfad, der so nicht (mehr?) passt.


    Mein erster Versuch war, nur den relativen Pfad als solchen zu fixen. Dann funktionierten die Buttons zwar, wenn man gpio-buttons.py manuell gestartet hat, aber nicht bei Systemstart über systemctl.


    Die robustere Variante mit absolutem Pfad funktioniert aber prima:

    Code
    def def_next():
    check_call("/home/pi/RPi-Jukebox-RFID/scripts/playout_controls.sh -c=playernext", shell=True)


    Gruß,

    Tobi

    Edited once, last by tobi79 ().

  • Hier mal ein paar Bilder vom Einhorn-Player für meine Tochter.


    auch ich habe für unseren Bedarf noch ein paar Features hinzugefügt, die es so noch nicht gab:


    • Automatisches Herunterfahren nach einer Maximalzeit, die über spezielle Elterntransponder einstellbar ist. Vermutlich braucht das sonst keiner, aber unsere Große hört auch mal die halbe Nacht durch, eh man sich versieht. Die aktuell verbleibende Restzeit wird über die bunten LEDs in den Löckchen angezeigt (stündlich geht eines aus, am Ende Auto-Shutdown).
    • Mit zwei der 5 Tasten (übrigens alles Knicklicht-Enden mit Schraube drin ;-) ) kann im aktuellen Hörspiel in 1-Minuten-Stückchen vor- und zurückgesprungen werden. Eine solche Funktion gibt es so im RC-Interface von VLC zwar nicht direkt, ließ sich aber über get_time und seek recht gut zusammenskripten. Die anderen 3 Tasten sind ganz profan voriges / nächstes Hörspiel sowie Herunterfahren (gedrückt halten)
    • Kleines Gimmick: Vor jedem Hörspiel wird der Titel angesagt. Habe mir dazu über Google Speech vorgelesene Audiodateien generieren lassen und das dann jeweils zusammengemerged. Echt praktisch :)
    • Noch ein Gimmick: Der RFID-Leser hat ja eine eigene LED, die sogar recht gut als Power-Anzeige taugt. Daher war es mir zu schade, dass das Licht im Gehäuseinneren versackt. Habe um die Stelle (Einhorn-Nase) herum einfach ein Loch in die Frontplatte gesägt und mit Heißkleber ausgegossen (temporäres Paketband hilft hier Wunder)

    Steht eigentlich irgendwo in den Anleitungen, dass man GPIO 0-8 nicht für LEDs nehmen sollte - insbesondere wenn man die per Transistor ansteuert? Die Pins werden durch den Prozessor blöderweise defaultmäßig als Input mit internem Pullup-Widerstand initialisiert, d.h. beim Hochfahren und nach(!) dem Herunterfahren liegt dort Spannung an. Für die Transistorbasis reicht das schon --> LEDs leuchten. Habe am Ende aufgegeben, der Kiste das softwareseitig abzugewöhnen - geht offenbar nicht, wenn man den Pin im Betrieb auch selbst beliebig benutzen möchte. Nochmal GPIOs wechseln, wenn alles schon schön verstaut ist, macht nicht so richtig Spaß :(


    p.s.: Falls jemand an Code interessiert ist, einfach melden!


    Gruß,

    Tobi



    Edited 3 times, last by tobi79 ().

  • tobi79


    Bitte gebe mir mal den Code. Mich interessieren die Elternkarten und auch die LEDs. Ich versuche das auch in meine neuen Anleitung reinzubasteln. Ich denke das hilft schon weiter. Meinem Bruder geht es auch auf dem Sack, dass mein Patenkind bis tief in die Nacht Hörspiele hört :).

    Das mit dem Spulen brauchen wir jetzt nicht direkt aber würde ich auch aufnehmen.


    Sieht sehr schön aus.

  • Sehr schön! Eine Detailfrage hätte ich: Ist eine Anzeige der Restlaufzeit mit einstündiger Auflösung bei einer Gesamtlaufzeit von einer Stunde nicht relativ wenig aussagkräftig?

  • Bitte gebe mir mal den Code. Mich interessieren die Elternkarten und auch die LEDs. Ich versuche das auch in meine neuen Anleitung reinzubasteln. Ich denke das hilft schon weiter. Meinem Bruder geht es auch auf dem Sack, dass mein Patenkind bis tief in die Nacht Hörspiele hört :).

    Das mit dem Spulen brauchen wir jetzt nicht direkt aber würde ich auch aufnehmen.


    Sieht sehr schön aus.

    Danke. Code verlinke ich demnächst mal. Ich muss noch an einem Detail etwas feilen, dann ist es bald final.


    Sehr schön! Eine Detailfrage hätte ich: Ist eine Anzeige der Restlaufzeit mit einstündiger Auflösung bei einer Gesamtlaufzeit von einer Stunde nicht relativ wenig aussagkräftig?

    Klar, ein sekundengenauer Countdown ist das nicht ;-) Prinzipiell kann man das ja einrichten, wie man möchte. Ich hab auch kurz überlegt, ob ich den "Balken" halbstündig verkürze (darstellbare Maximaldauer 3h reicht ja an sich auch) oder die Abstufung unterschiedlich feingranular mache, je nachdem, welche Maximalzeit an dem Tag gerade aktiviert wurde,


    Letzteres fand ich dann aber doch nicht so eine gute Idee, da das Kind dann schlecht einschätzen bzw. sich merken kann, wie lang bei einer bestimmten Anzeige denn tatsächlich noch Zeit ist. Und feste 1-stündige Abstände haben den Vorteil, dass das ungefähr der Dauer eines typischen Hörspiels entspricht ("noch 2 Lampen heißt, dass ich noch 2 Hörspiele hören kann")


    Mal schauen, wie sich das in der Praxis bewährt...

  • "noch 2 Lampen heißt, dass ich noch 2 Hörspiele hören kann"

    Na ja, evtl. halt auch nur noch eins und die Titelansage vom nächsten. Eine wirklich bessere Idee habe ich aber auch nicht. Vielleicht volle Stunden anzeigen? Dann hieße zwei Lichter auch noch mindestens zwei Hörspiele, eines entsprechend eins und wenn nur noch die Nase leuchtet, geht noch was, aber eben kein ganzes Hörspiel mehr.

  • Könnte man das vielleicht pro Hörspiel als Ganzes setzten, also zwei Hörspiele, zwei LED, danach aus? Ich stelle mir das wie beim Fußball vor: Elfmeterschießen => unentschieden => letzter Schuss => der Spieler holt Anlauf und... Stromausfall (Sleeptimer). :shy: Das Kind kann die ganze Nacht nicht schlafen, weil es das Ende der Geschichte nicht kennt.

    Das hätte dann auch den Vorteil, das die Zeit evtl. nicht ganz aufgeht, die Kiste z.B. eine halbe Stunde vor dem eigentlichen "Termin" herunterfährt und somit dem Senker mehr Schlaf beschert. ;)

  • Hallo Zusammen,

    das mit dem Timer ist echt interessant. Würde ich gerne auch nachrüsten...


    Was anderes: Besteht eine einfache Möglichkeit eine Maximallautstärke einzurichten? Bei offenem Fenster wird momentan der ganze Innenhof beschallt...


    Viele Grüße

    Kristian

  • Das kannst du im vlc definieren.

    Einfach pi normal starten am Bildschirm und vlc starten. Unter Audioeinstellungen kannst da den Max wert eintragen.


    Bearbeitung

    Alternativ kannst du den Lautstärke Regler unten im vlc niedrig stellen, wenn die Lautstärke über Alsa geregelt wird.

  • Könnte man das vielleicht pro Hörspiel als Ganzes setzten, also zwei Hörspiele, zwei LED, danach aus?

    Prinzipiell könnte man das, ist aber etwas umständlicher.


    Man muss dabei erstmal beachten, dass das Kind anfangs "zappt" also von Titel zu Titel springt, bis es ein Hörspiel findet, das es dann anhören will. Also hart runterzählen, wie viele Hörspiel gestartet wurden, dauert evtl. nur 20 Sekunden und gibt Geschrei ;-)

    Auch nicht viel besser wäre zu zählen, wie viele Hörspiele wirklich bis zum Ende gehört wurden. Denn dann dauert es keine Woche und das Kind hat raus, dass man während der Endmusik frei zum nächsten weiterspringen kann ;-)


    Erschwerend kommt hinzu, dass das mit der aktuellen Funktionsweise nicht ganz zusammenpasst. Sobald man eine Playlist startet, rattert VLC damit los. Wenn VLC mit dem ersten Titel/Hörspiel durch ist, gibt uns VLC auch nicht extra bescheid, damit wir die LEDs aktualisieren können, sondern geht direkt zum nächsten Titel über.

    Man könnte nun z.B. ein Skript schreiben, das permanent nebenher läuft und den VLC-Status regelmäßig abfragt. Wenn es erstmalig erkennt, dass nun ein Titel läuft , der länger als die Restzeit dauert (dieser also offenbar gerade erst gestartet wurde) könnte man den abwürgen und abschalten.

    Das klingt schon besser, ist aber auch nicht ganz problemfrei. Zum einen ist die auslesbare Gesamtdauer bei MP3-Playern nicht immer verlässlich. Gerade bei Dateien mit variabler Bitrate (und das nutze ich) liegt die Schätzung gerne mal einige Prozente daneben, da hier nicht die gesamte Datei durchgescannt wird.

    Zum anderen könnte das Kind nach dem Ende des 1. Hörspiels wieder zappen um ein genehmes zweites zu finden. Da können einige zu kurz, andere zu lang sein. Wenn die Box dann beim Zappen über ein langes Hörspiel runterfährt, obwohl andere Hörspiele dahinter noch gepasst hätten - auch doof.



    Aktuell finde ich den Zeitansatz unter dem Strich noch am sinnvollsten. Vielleicht könnte man das Problem mit dem potentiell ungünstigen Abschaltzeitpunkt aber noch anders lindern. Ich überlege gerade, ob man nach Zeitablauf das aktuelle Hörspiel noch bis zu Ende laufen lassen kann.


    Dazu könnte das Abschaltskript (Pseudocode) etwa so aussehen:

    Code
    restdauer = vlc_get_length() - vlc_get_time() // restdauer ermitteln
    setShutdownTimer(restdauer * 1,05) // abschalttimer setzen mit etwas sicherheitsabstand
    vlc_clear() // aktuelle Playlist löschen, damit nach dem aktuellen Hörspiel nicht das nächste anfängt (klappt das?)


    oder etwas anderer Ansatz;

    Code
    letztes_hoerspiel = vlc_get_title() // merken, wie das aktuelle hörspiel heißt
    vlc_clear() // aktuelle Playlist löschen, damit nach dem aktuellen Hörspiel nicht das nächste anfängt (klappt das?)
    while(vlc_get_title() == letztes_hoerspiel){ // sekündlich checken, ob noch dieser Titel an ist
    sleep(1)
    }
    sudo shutdown now

    Werde das die Tage mal testen und mein Skript damit ggf. aktualisieren. Ich geb bescheid, ob das geklappt hat :)

  • Hallo Zusammen,


    bin immer noch meine Beschreibung schuldig, aber soviel vorweg, ich fahre die Jukebox per script (shutdown.sh) runter. Dieses Script wird täglich um 20.30h ausgeführt.

    Dazu einfach im Verzeichnis "etc" wie folgt vorgehen:

    1.) sudo nano crontab

    2.) Im Editor in der Tabelle am Ende die Zeile hinzufügen "30 20 * * * root /home/pi/shutdown.sh": Der untere Teil der Datei sieht bei mir wie folgt aus:


    # m h dom mon dow user command

    17 * * * * root cd / && run-parts --report /etc/cron.hourly

    25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

    47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

    52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

    30 20 * * * root /home/pi/shutdown.sh

    #


    3. crontab speichern (STRG+X)


    Viele Grüße

    X-Ray