Posts by Dennis89

    Kannst mal versuchen ob der nachfolgende Code läuft. Ich habe noch nie etwas mit 'ProcessPool' gemacht und den Code jetzt auch nicht getestet.

    Noch eine Anmerkung zu deiner Zeile 56. Wenn du in einer Funktion eine weitere aufrufen willst und dabei noch ein Argument 'water_led' übergeben willst, dann musst du dafür sorgen, das 'water_led' auch in der Funktion verfügbar ist. Sprich du musst es erst der Funktion übergeben, so wie mit 'video_file'.

    Aber das ist ja eh der falsche Ort, denn es war ja mal gewünscht dass der Wasserwerfer und die Videoaufnahme parallel ablaufen.


    Sollte mein Code nicht funktionieren, dann warten wir besser auf DeaD_EyE.



    Zu deinen Fehlermeldungen kann ich dir leider nichts sagen. Da müsste ich auch viel googln.


    Grüße

    Dennis

    Hallo,


    mich wundert dass das mit den Pfad-Objekten nicht funktioniert, wobei der Code so wie er ursprünglich war ja schon funktioniert hat.

    Ich habe mir den Code aus Beitrag 3 angeschaut und ihn als Grundlage genommen.

    Dort wird der Funktion 'change_video_format' nicht die ursprüngliche Video-Datei mit dem zu ändernden Format übergeben, sondern schon die die noch gar nicht existiert.

    Hab das mal kommentiert und abgeändert. Hoffe ich erzähl hier gerade kein Mist :blush:



    Grüße

    Dennis

    Wenn du du ein Objekt in einen String umwandeln willst, dann nutzt man str().

    Wenn du einfach video_file in Anführungszeichen setzt, dann fehlt dir das Pfad-Objekt, dass an den Namen 'video_file' gebunden wurde und du hast einen String 'video_file'.


    Hier ein Beispiel:



    Lass das mal laufen, kannst du dass dann nachvollziehen?


    Grüße

    Dennis

    Hallo,

    Kann man die Funktion transfer und die Funktion change_video_format ein zweites Script auslagern und im ersten Script nach der Funktion record_video starten, so dass im ersten Script sofort wieder die nächste Video-Aufnahme gestartet werden kann?

    du willst dass die zwei Funktionen ausgeführt werden, während dein Programm etwas anderes macht. Dabei kam mir gleich ein älteres Thema von dir in den Kopf. Ich hätte dass evenuell wie hier gelöst und würde dann zu diesem Ergebnis kommen:


    Jetzt bitte nicht die Idee von DeaD_EyE verwerfen, die ist alleine wegen der Fehlerbetrachtung schon besser.

    Wollte dir nur zeige dass du eine mögliche Lösung schon hattest.


    Grüße

    Dennis

    Hallo,


    ich habe ein altes Thema gefunden, dort soll auch etwas gemacht werden, wenn eine Audioausgabe erkannt wird. Leider ist es kein Pyhton, aber vielleicht findest du darin wertvolle Infos.



    Grüße

    Dennis

    Hallo,

    Das mit der Stadt habe ich im Control.py Script angepasst in dem ich es auf S/W gestellt habe da das Display keine Farben darstellen kann.

    Läuft, wenn auch leider nur S/W

    Ich kann dir nicht ganz folgen. Kannst du mal bitte genau beschreiben, was du wo und wieso geändert hast?


    Grüße

    Dennis

    Hallo,

    Du darfst dich sehr gern zum Code äußern.

    Also das Programm nachzuvollziehen ist mir ehrlich gesagt zu zeitaufwendig. Daher mal ein paar allgemeine Anmerkungen, die mir beim durchscrollen aufgefallen sind. Die Programmlogik habe ich dabei nicht berücksichtigt. Du solltest/könntest das Programm nochmal ordentlicher aufbauen. Vielleicht fällt es erfahrenen Programmierer einfacher da durchzublicken, mir nicht.


    Links dazu:

    https://www.python.org/dev/peps/pep-0008/

    https://docs.python.org/3/tutorial/



    Wie schon mal erwähnt, ‚as‘ wird verwendet um Module umzubennen. Du nennst GPIO in GPIO um.


    ‚flask.helpers‘, ‚LightWatcher‘ und ‚PlantController‘ wird importiert aber nicht verwendet.


    Auf Modul ebene gehört *kein* ausführbarer Code. Hier werden nur Konstanten, Funktionen und Klassen definiert. Alles andere gehört in eine Funktion. Üblicherweise besitzt ein Python-Programm eine Funktion mit dem Namen ‚main‘. Daraus wird der Programmablauf gesteuert, sprich Funktionen aufgerufen, Argumente übergeben und Rückgaben entgegen genommene.


    Ein führender Unterstrich machst du, weil du das auch anderen Programmiersprachen kennst? Wird hier nicht benötigt und hat auch keinen Einfluss auf den Namen.


    Thema Namen: Nur Konstanten werden GANZ_GROSS geschrieben, alle anderen Namen klein_mit_unterstrich. Die einzige Ausnahme sind Klassen-Namen, die schreibt man in CamelCase-Schreibweise.


    Wie auch schon mal erwähnt, man hält ein Programm nicht künstlich mit einem ‚pass‘ am Leben.


    Nach dem erstellen einer Klasse folgt die ‚__init__‘-Funktion, das man überhaupt erst mal weis was in der Klasse denn so los ist.


    ‚if not value is None‘ würde man ‚if value is not None‘ schreiben. Dabei stellt sich einem gleich die Frage, was das für ein Wert sein soll? Du solltest immer sprechende Namen verwenden. Zeichen pro Zeile sind laut dem Python Style-Guid vorgegeben. Da macht es meiner Meinung nach keinen Sinn eine lange ‚if‘-Abfrage ink. setzen von True und False in eine Zeile zu packen.


    Code
    if self.minTemperature > self.currentTemperature > self.maxTemperature:
        self.temperatureIsOkay = True
    else:
        self.temperatureIsOkay = False


    Zu deinem ‚del‘ kannst du dir den Thread mal durchlesen:


    https://www.python-forum.de/vi…=391937&hilit=del#p391937


    ‚if‘-Bedingungen benötigen keine Klammer.


    Eine Bedingung zu negieren würde man mit ‚not‘ machen, anstatt mit ‚!=‘.


    Für Wahrheitswerte werden keine 0en missbraucht, da nimt man ‚False‘.


    Strings werden nicht mit ‚+‘ zusammengepuzzelt. Wieso verwendest du nicht überall f-Strings?


    ‚os‘ benutzt man nicht mehr um fremde Programme zu steuern. Dafür gibt es ‚subprocess‘


    subprocess.run([„systemctl“, „start“, SmartGardenEmergencyWatcher.service“],check=True)


    Auch für den Umgang mit Pfaden verwendet man ‚os‘ nicht mehr, dafür gibt es‚pathlib‘. Sogar in der Doku zu ‚os‘ wird auf ‚pathlib‘ verwiesen. Ganz unten auf der Seite findest du auch die neuen Befehle in Bezug auf das alte ‚os‘.


    Was bezweckt das ‚pass‘ in ‚createDirectories‘?


    ‚handler‘ erwartet drei Argumente die gar nicht verwendet werden. Was macht das ‚exit‘ dadrin?


    Achja und nochmal, es gibt gpiozero, das ist einfach anzuwenden wie 'RPi.GPIO'.



    Grüße

    Dennis


    Edit: Um dir die Arbeit mit dem Styling etwas abzunehmen kannst du mal nach 'black' und 'isort' schauen.

    Hallo,


    okay also wird ein Gerät per Bluetooth mit dem Pi verbunden und die Wiedergabe der Musik steuerst du dann über dein Smartphone, Tablet oder was auch immer?


    Dann müsstest/könntest du Python nach einer Bluetoothverbindung suchen lassen. Sobald sich ein Gerät verbunden hat, schält dein Relais.

    Vielleicht kannst du das mit PyBluez machen?


    Habe gerade leider keine Zeit die Bibliothek ganz durchzuschauen. Eventuell schaue ich mir das heute Abend auch mal an.


    Grüße

    Dennis

    Hallo,


    glückwunsch zum Erfolg :thumbup:


    Ich will dir übrigends nichts böses mit meinen Beiträgen. Aber als ich mit Python angefangen habe, habe ich dank solchen Beiträgen viel gelernt und das gebe ich gerne weiter.


    P.S. der Aufruf 'python /home/...' verweist hoffentlich auf Python3? ;)


    Weiterhin viel Spass

    Dennis

    Hallo,


    zu deinem Code gibts noch etwas zu sagen, falls du interesse daran hast.

    'as' wird benutzt um Module umzubenennen, du nennst GPIO in GPIO um.

    Warnungen sind nicht dazu da um sie zu ignorieren, man sollte hier eher die Ursache beheben. In diesem Fall sollte ein 'GPIO.cleanup()' vor Programmende die Lösung sein.


    In Python steht kein ausführbarer Code auf Modulebene (der Teil ohne Einrückungen). Zum steuern des Programmablaufs verwendet man eine Funktion, die üblicherweise 'main' heißt.


    Namen schreibt man klein_mit_unterstrich, Ausnahmen sind Konstanten, die schreibt man GANZ_GROSS und Klassen in CamelCase-Schreibweise.

    Die 'if'-Abfrage benötigt keine Klammer und üblicherweise wird immer mit vier Leerzeichen eingerückt.

    Wieso rufst du mit dem callback nicht gleich 'checkState' auf?

    Das Programm mit 'pass' am Leben zu halten wird so auch nicht gemacht. 'pass' nutzt man während man einen neuen Code schreibt um keine Fehler zu erhalten, wenn beispielsweise Funktionen definiert sind, aber Inahlt noch fehlt.

    Ungetestet:


    Was natürlich noch etwas cooler und einfacher ist, ist gpiozero. Damit kannst du dann sowas oder sowas ähnliches machen, ungetestet:


    Grüße

    Dennis

    Hallo,


    ich habe auch mal etwas weiter versucht. Mit der einfachen 'when_held'- Methode habe ich es nicht geschafft eine Aktion auszuführen, wenn der Button nach der Betätigung eine definierte Zeit nicht mehr betätigt wird.


    Hier meine Lösung ink. GPIO-Pin Simulation:


    Grüße

    Dennis


    P.S. Dem ein oder anderen wird die Abfrage nach dem Pin-Status bekannt vor kommen. An der Stelle: Danke für die Inspiration.

    Hallo,


    ich habe mir nicht die ganze Doku angeschaut, aber ich habe das hier gefunden:

    https://larsimmisch.github.io/…dio.html#module-alsaaudio


    Eventuell kannst du eine virtuele Soundkarte dafür missbrauchen:

    https://www.alsa-project.org/wiki/Matrix:Module-aloop


    Oder du nutzt 'subprocess' und fragst regelmäßig den alsa-Status ab:

    https://wiki.ubuntuusers.de/ALSA/


    Grüße

    Dennis


    Edit: Das mit dem alsa-Status war wohl zu vorschnell von mir.


    Wie wird denn die Wiedergabe gestartet? Werden da immer manuell verschiedene Programme gestartet oder wie läuft deine Anwendung ab?

    Findest du nicht auch, das es jetzt an der Zeit ist, mal die genannten Tipps und Verbesserungen die dir in der letzter Zeit gegeben wurden genauer anzuschauen und versuchen umzusetzen? Dazu noch das offizielle Python-Tutorial durchzuarbeiten und dich dann an dein Problem machen?


    Hier ist wieder alles zusammen kopiert, Code steht nur auf Modulebene, 'os' und 'pathlib' ist wieder vermischt.


    Oder sind die geschriebenen Tipps schlecht verständlich? Wenn ja, kannst du gerne nachfragen.


    Wenn du natürlich nur einen fertigen Code haben möchtest, dann kannst du auch direkt danach fragen, dann spart man sich das drum rum Geschreibe.


    Es geht immer noch um diesen Code? Kannst du nachvollziehen wie 'video_file' zustande kommt?

    Wenn ja, dann kannst du das FTP in den Code in einer eigenen Funktion einbauen.

    Gehe den Code mal Zeile für Zeile durch. Schau dir erste die KONSTANTEN an, danach beginnst du in der Funktion 'main' und schaust was jeder Zeile für sich macht. Schreib dir alle Unklarheiten auf und stell sie hier und dann schaffen wir den letzten Schritt auch noch :thumbup:


    Grüße und viel Erfolg

    Dennis