Autostart greift nicht

  • Hallo zusammen,

    ich habe für mein MagicMirror Projekt 2 Skripte für HDMI on und HDMI off geschrieben, welche eigentlich vom Hauptskript aufgerufen werden sollen und dieses Skript soll auch in die Autostart.

    Das Hauptskript wurde erstellt per "sudo nano /etc/init.d/HDMI_onoff" und anschließend mittels "sudo chmod 755 /etc/init.d/HDMI_onoff" die Rechte vergeben. Das Skript wollte ich dann mit Befehl "sudo update-rc.d HDMI_onoff defaults" beim booten mit starten.

    Nach dem Reboot reagiert das Skript aber nicht, bzw. es passiert nichts und habe nun keine Ahnung ob es überhaupt mit gestartet wurde. Normalerweise sollte nach 60 Sekunden der HDMI sich deaktivieren, wenn keine Bewegung registriert wird und bei einer Bewegung der HDMI sich wieder aktivieren. Wenn ich das Skript manuell mit "sudo /etc/init.d/HDMI_onoff start" starte funktioniert es.

    Wo ist mein Fehler?

    Vg
    Endric

    Einmal editiert, zuletzt von Cyrgon (6. November 2016 um 14:53)

  • Hallo Endric,

    ohne Dein Skript zu kennen, versuche mal Folgendes:
    - Ersetze alle Pfade durch absolute Pfade
    - Shebang hast Du eingetragen?
    - Setze ein

    Code
    (sleep 30 && /Pfad/zu/Deinem/Skript/Skript.py) &


    vor den Aufruf Deines Skripts.

    Vermutlich ist noch nicht alles an Systemressourcen zur Verfügung bestellt - Deinem Skript fehlt die Basis, auf der es laufen könnte.

    Dein Skript funktioniert ja offensichtlich, wenn der RPi komplett hochgefahren ist.

    Durch das sleep 30 baust Du eine 30-sekündige Warteschleife ein. Erst danach wird Dein Skript gestartet. Und beides zusammen wird in den Hintergrund gesetzt, so dass der eigentliche Boot-Porzess weiterläuft, bis alles an Ressourcen, Diensten, Pfade etc. bereit steht.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (6. November 2016 um 15:40)

  • Hallo Andreas,

    das halt leider nicht geholfen. Hier sind die Codes meiner Skripte, aber bitte nicht lynchen.... Programmieren ist überhaupt nicht meins. ;)

    HDMI_onoff

    [code=php]#! /bin/sh
    ### BEGIN INIT INFO
    # Provides: HDMI_onoff
    # Required-Start:
    # Required-Stop:
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: HDMI on/HDMI off
    # Description:
    ### END INIT INFO

    case "$1" in
    start)
    /home/pi/pirmm.py
    ;;
    stop)
    ;;

    esac

    exit 0[/php]

    "Stop" habe ich mit Absicht nicht gefüllt, da der MagicMirror durchlaufen soll.

    pirmm.py

    [code=php]#!/usr/bin/env python

    import sys
    import time
    import RPi.GPIO as GPIO
    import subprocess

    GPIO.setmode(GPIO.BCM)
    SHUTOFF_DELAY = 60
    PIR_PIN = 23

    def main():
    GPIO.setup(PIR_PIN, GPIO.IN)
    turned_off = False
    last_motion_time = time.time()

    while True:
    if GPIO.input(PIR_PIN):
    last_motion_time = time.time()
    print ".",
    sys.stdout.flush()
    if turned_off:
    turned_off = False
    turn_on()
    else:
    if not turned_off and time.time() > (last_motion_time + SHUTOFF_DELAY):
    turned_off = True
    turn_off()
    time.sleep(.1)

    def turn_on():
    subprocess.call("sh /home/pi/MagicMirror/HDMI_on.sh", shell=True)

    def turn_off():
    subprocess.call("sh /home/pi/MagicMirror/HDMI_off.sh", shell=True)

    if __name__ == '__main__':
    try:
    main()
    except KeyboardInterrupt:
    GPIO.cleanup()[/php]

    HDMI_on.sh ist nur befüllt mit vcgencmd display_power 1 und die HDMI_off.sh mit vcgencmd display_power 0.

    Vg,
    Endric

  • HDMI_on.sh ist nur befüllt mit vcgencmd display_power 1 und die HDMI_off.sh mit vcgencmd display_power 0.


    Was bedeutet das?Das Bash-Script enthält doch nur den Programmstart /home/pi/pirmm.py. Von vcgencmd display_power finde ich da nix.


    HDMI_onoff


    Die Philosophie hinter systemd in Debian hat eigentlich zum Ziel, diesen ganzen Schrott an Init-Scripten zu entsorgen. Darunter fällt auch Dein Start-Script. Anstatt den eigentlichen Prozess indirekt via unnötigem Script zu starten, solltest Du das lieber direkt via systemd tun, und zwar mit (als Beipsiel) dieser service-unit.

    Code
    nano /etc/systemd/system/pirmm.service

    Jetzt noch die Rechte auf root:root und 644 setzen und fertig.
    Starten und stoppen der Unit wie folgt:

    Code
    systemctl start pirmm.service
    systemctl stop pirmm.service

    Den Status bzw. die Meldungen der Unit wie folgt anzeigen:

    Code
    systemctl status pirmm.service

    Um es beim Boot automatisch zu starten, wie folgend:

    Code
    systemctl enable pirmm.service

    Da ich was von HDMI gelesen habe, habe ich den Start deines Programms einfach ans Ende der Boot-Kette gesetzt. Weil ich nicht weiss, was das Programm in Wirklichkeit tut, habe ich mal unterstellt, dass es gestartet wird, schnell etwas tut und sich wieder beendet. Soll es hingegen jedoch als Dienst aktiv bleiben und irgendwann beim Shutdown auch wieder was tun, muss die Unit umgeschrieben werden. Das ist aber einfach.

    Einmal editiert, zuletzt von WinterUnit16246 (6. November 2016 um 16:51)

  • FAQ => Nützliche Links / Linksammlung => Autostart


    Ich versteh nicht ganz wieso du mehrere Scripts verschachtelst.
    Du hast ein /etc/init.d/ Script zum Starten - mehr macht das nicht. In dem Script wiederum rufst du ein Python Script auf und in dem wiederum rufst du wieder bash Scripte auf ... Und in den wiederum ist bestimmt nur eine Zeile drin... :-/ Schönes Chaos

  • Ich habe mich jetzt nicht weit genug da eingelesen, aber nach Meigrafd's Einwände und wenns wirklich nur um die beiden Befehle geht, kann man das auch einfach in der Unit lösen.... ganz ohne Scripte. Beim Booten wirds aktiviert, beim Shutdown wieder deaktiviert.....

    Einmal editiert, zuletzt von WinterUnit16246 (6. November 2016 um 17:00)

  • Naja seinem Python Script nach will er die HDMI Schnittstelle bei Bewegung ( PIR ) einschalten und wenn keine Bewegung mehr erkannt wurde wieder ausschalten.

    Das PIR Script läuft also permanent - wobei es mit der while Schleife eher schlecht gelöst ist, nicht nur while Ansich, sondern auch dass diese ungebremst rotiert und somit 100% CPU Last erzeugen wird.

    Ich vermute mal das in /home/pi/MagicMirror/HDMI_on.sh nur eine Zeile drin steht, nämlich: tvservice -p

    Daran würde ich grundlegend etwas ändern.
    Erst mal das Python Script umschreiben und auf Interrupt umrüsten. Zum Beispiel:

    Spoiler anzeigen

    [code=php]
    #!/usr/bin/python
    import time
    import RPi.GPIO as GPIO
    import signal

    PIR_PIN = 24
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(PIR_PIN, GPIO.IN)

    def interrupt_event(pin):
    zeit = time.strftime('%d.%m.%Y %H:%M:%S')
    print '{} -> GPIO {} ausgeloest! Motion detected'.format(zeit, pin)

    def main():
    try:
    GPIO.add_event_detect(PIR_PIN, GPIO.RISING, callback=interrupt_event, bouncetime=100)
    #keep script running
    signal.pause()
    except KeyboardInterrupt: # does not work if it runs in background.
    print "Quit"

    if __name__ == '__main__':
    main()
    GPIO.cleanup()
    print "Ende des Scripts"
    [/php]Das ist zwar auch noch nicht so optimal weil man in der interrupt_event (ISR) Funktion nicht viel machen sollte, aber sollte hierfür nicht allzu schlimm sein.

    Guck dir mal das Python Module 'gpiozero' an das ist für sowas eigentlich super und viel viel moderner als RPi.GPIO

    Dann würde ich nicht mehr HDMI_on.sh usw im Python Script ausführen sondern direkt den Befehl zum Ein/Aus-schalten der HDMI Schnittstelle. Eine Ecke möglicher Fehlerquellen weniger.

  • Danke für eure Informationen. Ich weiß das die Skriptlösung sehr subotpimal ist. Da dies aber mein erstes vollständiges Projekt ist, bin ich dennoch stolz es irgendwie geschafft zu haben. ;)

    meigrafd: Danke, ich werde heute abend Dein Skript übernehmen und mal sehen, ob ich so damit zurecht komme.

    Ich nutze den Befehl "tvservice" nicht. Das hat 2 Gründe. 1. Dauert es länger bis das Bild wieder da ist und 2. zeigt mein alter Monitor dann immer die Meldung "Kein Signal" und geht nicht in den Ruhemodus. Also als MagicMirror nicht zu gebrauchen. Beim Befehl vcgencmd display_power schaltet der Monitor aber sofort in den Stromsparmodus und wenn eine Bewegung erkannt wird, ist das Bild binnen, gefühlten, 2 Sekunden wieder da. Ein Deaktivieren der Meldung "Kein Signal" bietet der alte Schinken gar nicht erst an.

  • Dann versuch es erst mal so:

    Und das Python Script kannst du eigentlich auch weiterhin problemlos in /etc/rc.local eintragen sodass es in den Hintergrund geschickt wird. Spätestens in ein paar Jahren sollte man aber auch die von ThomasL genannte systemd Variante umsteigen.

  • Moin zusammen,

    ich habe da noch eine kleine Zwischenfrage, da ich gerade etwas verunsichert bin und keinen Fehler machen will.
    Ich hatte gestern mein per " sudo update-rc.d -f HDMI_onoff remove" aus der Autostart entfernen wollen. Ich weiß jetzt nicht ob diese Meldung vorher dort stand, aber beim reboot erscheint nun "[/etc/init.d/HDMI_onoff:3] Failed to add LSB Provides name HDMI_on/HDMI_off.service, ignoring: No such file or directory".

    Ich habe anschließend nochmals " sudo update-rc.d -f HDMI_onoff remove" ausgeführt, aber die Fehlermeldung erscheint dennoch. Ich habe nichts manuell eingetragen, sondern nur mit "sudo update-rc.d HDMI_onoff defaults".
    Bevor ich das neue Script einfüge, wie bekomme ich das alte wieder raus?

    Vg
    Endric

  • Hallo liebes Forum,

    hallo meigrafd,

    ich würde mich riesig über Hilfe freuen.

    Ich würde gerne per per Sensor den HDIM-Port anschalten lassen und wenn keine Bewegung stattfindet ausschalten lassen. Also so, wie meigrafd es in Post #9 geschrieben hat.

    Allerdings sind die Einrückungen verloren gegangen und ich kenne mich nicht mit Programmieren aus (kopieren kann ich ;))

    Würde sich bitte jemad die Mühe machen und das Script von oben für mich reparieren?

    Danke im Voraus!

  • Mit den Einrückungen kann ich dir auch nicht helfen, aber wenn du den Text von oben kopierst und in code-Tags packst sieht das so aus:

    EDIT: Oder auch nicht.

    Das nächste umziehen der Forensoftware möchte ich nicht machen. ;)

  • Ich hab meigrafd post mal editiert. So sollte es passen

    Nope, nicht ganz :richter: die while gehört in die main Funktion ;)

    => https://github.com/meigrafd/Sampl…/PIR_monitor.py

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!