Posts by Dennis89

    Hallo,


    Nenne als erstes mal dein heruntergeladen Ordner um und lösche die *.7z Datei, falls vorhanden. Falls alles in in '/home/pi/' liegt:

    Code
    mv /home/pi/Fan_HAT /home/pi/Fan_HAT_old -r
    rm /home/pi/Fan_HAT.7z -r


    Dann versuche mal:

    Bitte darauf achte, ob jeder Schritt erfolgreich ausgeführt wird. Wenn nicht, jeden Fehler vollständig kopieren und hier posten. :thumbup:


    P.S. bcm2835 benötigst du, wenn du C benutzen willst, aber wir sind ja gerade bei Python3


    Grüße

    Dennis

    Hallo,


    ich würde das ganze vollständig mit Python lösen. Für das Erkennen von USB-Geräten gibt es zum Beispiel pyudev.


    Strings puzzelt man übrigends nicht mit '+' zusammen. Hier würde sich ein f-String anbieten:



    Grüße

    Dennis

    Hallo,

    Hat das einen echten Nachteil

    Ja das hat es und ist zum Beispiel hier beschrieben.


    warum da hinter der Variable "= None"

    Wenn man eine Klasse erstellst werden alle Namen in der '__init__' definiert. Die von dir genannten Namen erhalten im Laufe des Programms Wahrheitswerte, aber zu Beginn wäre True oder False aber nicht richtig, deswegen None.

    Mit dem 'self' kann man dann innerhalb der Klasse auf die Namen zugreifen, sie verändernt oder abfragen.


    Grüße

    Dennis

    Hallo,


    zu deinem Python-Code:

    'as' ist zum umbenennen da. Du nennst 'GPIO' in GPIO' um. 'signal' wird importiert aber nicht genutzt.

    Grundsätzlich schreibt man keinen Code von oben nach unten. Das Hauptprogramm wird in Python aus einer Funktion mit dem Namen 'main' gesteuert. Daraus werden weitere Funktionen aufgerufen, Argumente übergeben und Rückgaben entgegen genommen.

    Das heißt, das auf Modulebene kein ausführbarer Code stehen darf. Hier gehört nur Code hin, der Funktionen, Klassen und Konstanten definiert.

    Egal welchen Taster du drückst, jedes mal wird '23' auf high gesetzt und '5' auf low. Ist das so gewünscht? Wenn ja, dann macht man das in einer Funktion und schreibt den gleichen Code nicht zwei mal, das gilt auch für die zwei 'else'-Zeilen.

    'shell=True' nur verwenden, wenn es einen driftigen Grund dazu gibt. Normalerweise gilt 'shell=False', das ist auch der default-Wert. Hierbei geht es um sicherheitstechnische Gründe, das kannst du gerne mal nachlesen. Wenn du dabei auf Programmbeispiele stoßt, schau dir die genau an, manche löschen dir unerwünscht alle Daten, wenn du die einfach kopierst und laufen lässt.

    Nach dem der 'subprocess'-Aufruf durch ist dann wurde an 'ultrastar' irgendwas wie "<subprocess popen object.."gebunden. Das ist zwar nicht "None", da du aber auch keine weiteren Wahrheitswerte abfragst, ist das auch mit 'None' eher überflüssig.

    Wenn du den Erfolg eines 'subprocess'-Aufruf haben willst, kannst du zum Beispiel 'ultrastar.returncode' abfragen.

    In Zeile 28 'photobooh' ist nicht definiert, da fehlt das 't'.

    Anstatt 'GPIO' könntest du gpiozero verwenden, das ist meiner Meinung nach einfacher/schöner und lesbarer.

    Ungetestet:


    Grüße

    Dennis


    Edit: ich hatte den Beitrag angefangen, bevor hyle geschrieben hat, daher der doppelte Hinweis auf 'gpiozero'. Die absoluten Pfade hatte ich vergessen. :blush:

    Hallo,


    jetzt komme ich auch noch mit einer Antwort daher.

    F-String war das Zauberwort für Tante Google, ich glaub, das hab ich alles verstanden.

    Dann könntest du das in deinem Beispiel-IP-Code auch verwenden. 8o


    Dein 'cmd' besteht ja aus einem Befehel und einer zusätzlichen Option. 'subprocess' erwartet an dieser Stelle laut Dokue '*args'. Ne da ist keiner auf der Tastatur eingeschlafen, das bedeutet 'subprocess' hätte gern ein Objekt über das er iterieren kann. So wie man das zum Beispiel mit einer 'for'-Schleife bei Listen macht. Das ist ein geschickter Vergleich, du könntest deine Befehle in eine Liste schreiben und die dann übergeben. Dann lass dir aber zum Vergleich mal noch das "Ergebnis" ausgeben, dass das 'split' von hyle fabriziert. Vielleicht ist das ja auch eine Liste :geek:


    Grüße

    Dennis

    Hallo,


    'tkinter' und 'kivy' sind nur für die Darstellung zuständig. Also die grafische Aufbereitung deines Programms. Die Aufnahme starten und stoppen sind davon unabhängig und sollte ein Programmteil für sich sein.

    Schau mal dass du die Bedienung der Kamera ohne das grafische Zeugs hinbekommst. Erst wenn das steht baut man dann Button's und Co. drum rum. Ob die dann von 'tkinter', 'kivy', 'Qt' oder was auch immer kommen, sollte keine Rolle spielen.


    Grüße

    Dennis

    Hallo,


    in der Kivy-Dokumentation gibt es extra einen Abschnitt für die Installation auf dem Pi. Damit läuft Kivy, zumindest lief es auf einer Desktop-Version von Buster bei mir.


    Bin gerade am Handy, deswegen musst du die Doku mal selbst durchsuchen.


    Grüße

    Dennis

    Hallo,


    es macht grundsätzlich, unabhängig von diesem Problem, Sinn ein Programm betriebssystemunabhängig aufzubauen. Wenn man schon mit Pfade arbeitet bietet es sich an pathlib zu verwenden. Zum einen kann man einfach Pfade ändern/bearbeiten/Dateien löschen und zum anderen könnte man die Funktion auch für weitere Programme wieder verwenden und muss nicht mit Linux-Befehlen rumhantieren.


    Grüße

    Dennis

    Hallo,

    Kann man das nicht abfangen?

    Log-Datei:

    Terminalausgabe:

    Code
    10.0
    5.0
    3.3333333333333335
    2.5

    Als kleines Beispiel, Formatierungen und viele Anpassungen sind möglich.


    Grüße

    Dennis

    Hallo,


    ich bin mir mit meiner Antwort nicht sicher. Du benutzt diesen Code:

    https://github.com/adafruit/Ad…afruit_ADS1x15/ADS1x15.py


    Darin rufst du diese Funktion auf:

    Willst du das machen, was in dem Kommentar steht? Das Ergebnis wird minus sein, weil dein erster Channel kleiner sein wird als dein zweiter.

    Vielleicht willst du lieber diese Funktion nutzen?

    Code
        def read_adc(self, channel, gain=1, data_rate=None):
            """Read a single ADC channel and return the ADC value as a signed integer
            result.  Channel must be a value within 0-3.
            """
            assert 0 <= channel <= 3, 'Channel must be a value within 0-3!'
            # Perform a single shot read and set the mux value to the channel plus
            # the highest bit (bit 3) set.
            return self._read(channel + 0x04, gain, data_rate, ADS1x15_CONFIG_MODE_SINGLE)

    Klick dich mal dur den GitHub Link, da müsstest du auch zu einer Doku kommen, dann kannst du gleich überprüfen ob das mit deinem 'GAIN' so richtig ist :conf:


    Grüße

    Dennis

    Hallo,


    jetzt funktioniert es wieder, auch Nextcloud :bravo2:


    Dieses mal habe ich aber etwas geändert und zwar habe ich in der /etc/wireguard/wg0.conf auf dem VServer folgendes eingetragen:

    Code
    PostUp = ufw route allow in on wg0 out on ens192
    PostUp = iptables -t nat -I POSTROUTING -o ens192 -j MASQUERADE
    PostUp = ip6tables -t nat -I POSTROUTING -o ens192 -j MASQUERADE
    PreDown = ufw route delete allow in on wg0 out on ens192
    PreDown = iptables -t nat -D POSTROUTING -o ens192 -j MASQUERADE
    PreDown = ip6tables -t nat -D POSTROUTING -o ens192 -j MASQUERADE

    und in in /etc/sysctl.conf folgende Zeilen aktiviert:

    Code
    net.ipv6.conf.all.forwarding = 1
    net.ipv4.ip_forward = 1

    Anschließend ein sysctl -p


    Und bis jetzt läufts :)


    Kann zu den Einstellungen bitte jemand was sagen? Zum einen ob es daran liegen kann und wenn ja, wieso es mit den alten Einstellungen teilweise auch funktioniert hat und zu anderen, bringen die Einstellungen irgendwelche Gefahren und oder unerwünschtes Verhalten mit sich?


    Grüße

    Dennis