Beiträge von WilliamSpiderWeb

    Funktioniert jetzt. Allerdings nicht als User Unit, sonder normale System Unit.

    Ich weiß allerdings nicht, was ich großartig anders gemacht habe.

    Ich schreibe dann mal nieder, was ich gemacht habe, damit das Thema auch einen Abschluss hat.

    Installiert habe ich das Raspbian Stretch Lite vom 13.11.2018.

    Grundeinstellungen vorgenommen:

    Code
    sudo raspi-config

    Localisation Options

    - Change Local --> de_DE.UTF-8

    - Change Timezone --> Berlin

    - Change WiFi-Country --> German

    Change User Passwort

    Hostname

    Interfacing Options

    - SSH --> Enable

    Advanced Options

    - Expand Filesystem

    - Memory Split --> 64

    Update

    Finish

    Einmal neustarten

    Code
    sudo reboot

    Per SSH eingeloggt.

    Betriebssystem aktualisiert:

    Code
    sudo apt-get update
    sudo apt-get dist-upgrade
    sudo apt-get upgrad

    FTP-Server installieren:

    Code
    sudo apt-get install ftp

    Mqtt Broker installieren

    Code
    sudo apt-get install -y mosquitto mosquitto-clients

    Paketinstaller für Python installiert

    Code
    sudo apt-get install python-pip3

    System von heruntergeladenen Paketen wieder befreit:

    Code
    sudo apt-get clean

    Benötigte Python Pakete installiert:

    Code
    sudo pip3 install paho.mqtt
    sudo pip3 install events
    sudo pip3 install RPi.GPIO

    System Unit schreiben:

    Code
    sudo nano /etc/systemd/system/myscript.service

    Inhalt der Unit:

    Code
    [Unit]
    Description=Autostart meiner ControlPi Scripte
    After=network-online.target
    [Service]
    Type=simple
    ExecStart=/usr/bin/python3 /home/pi/control_scripts/autostart.py
    [Install]
    WantedBy=multi-user.target

    Unit "scharf" schalten:

    Code
    sudo systemctl daemon-reload
    sudo systemctl enable myscript.service

    Schreibzugriffe auf SD-Karte minimieren:

    Code
    sudo nano /etc/fstab

    Ergänzung in der fstab:

    Code
    none /var/log/ tmpfs size=5M,noatime 00

    Swapping deaktivieren

    Code
    sudo dphys-swapfile swapoff
    sudo systemctl disable dphys-swapfile
    sudo apt-get purge dphys-swapfile

    Nach einem Neustart hat alles wie gewünscht funktioniert. Nach der gesamten Prozedur habe ich ein System, das übers Netzwerk mittels MQTT mit meinem Smart-Home-Server kommunizieren kann, GPIOs schaltet und auf GPIOs reagiert. Und es sollte möglichst unempfindlich gegen plötzlichem Spannungsabfall sein.

    Ich hoffe, ich habe nichts vergessen zu dokumentieren, was ich noch selbst prüfen werde.:)

    Und ich hoffe, dass ich nirgends Quatsch erzählt habe...

    Vielen Dank für die geduldige Hilfe. Ohne Euch wäre ich sicher nicht zu einer Lösung gekommen. Auch wenn ich nicht verstanden habe, wo nun letztendlich mein Fehler lag.

    Viele Grüße,

    Alex

    Ich hab grad keine überzähligen SD-Karten mehr zu Hause. Ich bestell mir jetzt Neue, flashe sie mit dem aktuellsten Raspbian Stretch lite und werde das dann schrittweise nochmal aufbauen. Irgendwo muss ich ja nen Fehler gemacht haben.

    Werde mein hoffentlich positiveren Ergebnisse dann hier posten.

    Das disablen klappt nicht

    Code
    pi@ControlPiArbeiten:~ $ sudo systemctl disable myscript.service
    Failed to disable unit: No such file or directory

    Hatte die Service-Unit ja auch in den Userbereich verschoben. Kann ich aber komischerweise auch nicht disablen.

    Code
    pi@ControlPiArbeiten:~ $ sudo systemctl --user disable myscript.service
    Failed to connect to bus: Datei oder Verzeichnis nicht gefunden

    Wie erwartet kommt beim Status dann auch nicht viel positives raus.

    Hofei

    Das ist schon ein bischen fies. ;)

    Hab ich mein System mittlerweile so weit zerschossen, dass ich besser von vorne anfange? :/:(

    Scheinbar bin ich nicht beschaffen für Systemd Units.

    Bin beim Erstellen der Timer-Unit nach der genannten Ubuntu-Anleitung vorgegangen.

    Code
    sudo nano /etc/systemd/system/myscript.timer

    Der Pfad wundert mich ein wenig, Hätte hier auch den Pfad /etc/systemd/user/ als den Richtigen erwartet.

    Der Inhalt der myscript.timer ist:

    Code
    [Unit]
    Description=Startet meine ControlPi-Scripte
    
    [Timer]
    OnBootSec=1min
    Unit=myscript.service
    
    [Install]
    WantedBy=multi-user.target

    Anschließend Fehlermeldung beim Starten...

    Code
    pi@ControlPiArbeiten:/etc/systemd/system $ sudo systemctl enable myscript.timer
    pi@ControlPiArbeiten:/etc/systemd/system $ sudo systemctl start myscript.timer
    Job for myscript.timer failed.
    See "systemctl status myscript.timer" and "journalctl -xe" for details.

    Die Statusabfrage zeigt folgende Fehler...

    Code
    pi@ControlPiArbeiten:/etc/systemd/system $ systemctl status myscript.timer
    ● myscript.timer - Startet meine ControlPi-Scripte
       Loaded: loaded (/etc/systemd/system/myscript.timer; enabled; vendor preset: enabled)
       Active: inactive (dead)
    
    Feb 21 16:17:03 ControlPiArbeiten systemd[1]: myscript.timer: Refusing to start, unit to trigger not loaded.
    Feb 21 16:17:03 ControlPiArbeiten systemd[1]: Failed to start Startet meine ControlPi-Scripte.
    Code
    pi@ControlPiArbeiten:~ $ systemctl is-enabled myscript.service
    Failed to get unit file state for myscript.service: No such file or directory
    pi@ControlPiArbeiten:~ $ systemctl --user is-enabled myscript.service
    enabled

    Umgebungsvariablen habe ich in meinen Scripts nicht verwendet.

    Und User Units ohne Anmeldung starten habe ich hierüber aktiviert. Zumindest habe ich den Absatz so verstanden, dass das darüber gemacht wird.

    Code
    sudo loginctl enable-linger pi

    Folgendes habe ich nun eingerichtet.

    Code
    sudo mv /lib/systemd/system/myscript.service /etc/systemd/user/myscript.service
    systemctl --user enable myscript.service
    sudo loginctl enable-linger pi

    Der Test ohne Reboot

    Code
    pi@ControlPiArbeiten:~ $ systemctl --user start myscript.service
    pi@ControlPiArbeiten:~ $ systemctl --user status myscript.service
    ● myscript.service - Autostart meiner ControlPi Scripte
       Loaded: loaded (/etc/systemd/user/myscript.service; enabled; vendor preset: enabled)
       Active: active (running) since Thu 2019-02-21 10:47:59 CET; 1min 8s ago
     Main PID: 696 (python3)
       CGroup: /user.slice/user-1000.slice/user@1000.service/myscript.service
               └─696 /usr/bin/python3 /home/pi/control_scripts/autostart.py
    
    Feb 21 10:47:59 ControlPiArbeiten systemd[540]: Started Autostart meiner ControlPi Scripte.

    Der Test mit Reboot

    Code
    pi@ControlPiArbeiten:~ $ systemctl --user status myscript.service
    ● myscript.service - Autostart meiner ControlPi Scripte
       Loaded: loaded (/etc/systemd/user/myscript.service; enabled; vendor preset: enabled)
       Active: inactive (dead)

    Das sieht doch schon einmal vielversprechend aus.

    Das Starten über die Unit funktioniert, aber die Unit scheint beim Reboot (noch) nicht aktiviert zu werden.

    Meine Scripte laufen nun unter Python 3.

    Dazu waren ein paar Modifikationen in meinen Scripten nötig, sowie ein paar Nachinstallationen.

    Code
    pip3 install RPi.GPIO
    pip3 install events
    pip3 install paho-mqtt

    Es läuft also nun beim Direktstart mit

    Code
    /usr/bin/python3 /home/pi/autostart.py

    Starte ich das Script über die Unit, kommt trotzdem der Event-Fehler

    Hmm... X/

    Beim "Type=simple" ist das "RemainAfterExit" nicht erforderlich und dass das "graphical.target" sinnvoll sein soll, wenn Du keine Desktop-Version benutzt (d. h. keine grafische Anmeldung statt findet), hat niemand behauptet.

    Dann bin ich ja beruhigt. :D

    Eine Korrektur zu meiner Aussage (#33) muss ich noch tätigen. Das Beschriebene war das Ergebnis meiner Script-Version, in der ich Testweise die Events auskommentiert hatte. Hatte ich übersehen.

    Verwende ich das Script, in dem das Event-Modul nicht auskommentiert ist, schlägt das Starten des Scriptes über die Unit fehl.

    Also was sagen die Experten?

    Muss ich mein Script auf Python3 umschreiben, obwohl der Direktstart mit Python 2.7 ja funktioniert?

    Oder ist einfach noch irgendetwas nicht geladen, was von dem Event-Modul benötigt wird?

    Gestern hab ich mir mal einen freien Abend genommen. Heute wird weitergebastelt. :)

    Meine Unit sieht nun so aus.

    Code
    [Unit]
    Description=Autostart meiner ControlPi Scripte
    After=network-online.target dhcpcd.service
    [Service]
    Type=simple
    ExecStart=/usr/bin/python /home/pi/autostart.py
    [Install]
    WantedBy=graphical.target

    Kein "RemainAfterExit" mehr und ich habe noch nicht verstanden, warum "graphical.target" sinnvoll ist, obwohl ich keine Desktop-Version verwende.

    Trotzdem sieht's nach dem Reboot des Pis so aus.

    Code
    pi@ControlPiArbeiten:~ $ systemctl status myscript.service
    ● myscript.service - Autostart meiner ControlPi Scripte
       Loaded: loaded (/lib/systemd/system/myscript.service; enabled; vendor preset:
       Active: active (running) since Wed 2019-02-20 22:05:32 CET; 3min 18s ago
     Main PID: 498 (python)
       CGroup: /system.slice/myscript.service
               └─498 /usr/bin/python /home/pi/autostart.py
    
    Feb 20 22:05:32 ControlPiArbeiten systemd[1]: Started Autostart meiner ControlPi

    Und das Script läuft tatsächlich. Es reagiert auf Kommandos über Mqtt. :thumbup:

    Einzig "Events" werden immer noch nicht geworfen.:thumbdown:

    Dazu noch eine Idee?

    Manul

    Habe die Installation von events wie in Beitrag #18 beschrieben durchgeführt, würde aber heute Abend mal nach angesprochenen Konfigurationen suchen.

    rpi444

    Okay, werde ich heute Abend testen.

    Ich benutze nicht die Desktop-Umgebung von Raspbian. Mein Pi bleibt in der Konsolenumgebung. Was soll denn das "graphical.target" bewirken?