Posts by keepfear

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!

    Loguru brauchst du nicht unbedingt. Yaml eigentlich auch nicht. Das war nur dazu da um deine Sensiblen Daten auszulagern. Damit du dein Script bedenklos posten kannst ohne Passwort und Telefonnummer ggf. preiszugeben. Außerdem erspart dir das auch arbeit, weil du ja deine Daten nicht immer wieder entfernen musst.


    Das Buster ist aber schon sehr alt. Hast du noch ne SD-Karte wo du Bullseye draufhauen kannst?

    Operating system images – Raspberry Pi
    From industries large and small, to the kitchen table tinkerer, to the classroom coder, we make computing accessible and affordable for everybody.
    www.raspberrypi.com


    Welches Script hast da jetzt benutzt?

    und mit einem Zeit Trigger passieret gar nichts

    Doch da passiert schon was, nur siehst du das eben nicht. Deswegen hast du doch das Log.

    Ich bin mir relativ sicher, wenn die Kamera läuft, das Script auch durchlaufen wird.


    Warum der Abbruch mit strg-c im Log nicht mit aufgeführt wird, wenn schedule der Auslöser ist, kann ich dir nicht sagen.

    Das camera_light.off() ist 2x enthalten, weil du nach beenden des Scripts alles abschalten willst. Auch die LED.


    Ansonsten muss ich erstmal meine gefühlt 100000 Bilder löschen, die ich mir selbst beim testen geschickt habe.

    Da gabs nen Timeout weil keine Daten von der Kamera kamen.

    Python
    picamera.exc.PiCameraRuntimeError: Timed out waiting for capture to end
    picamera.exc.PiCameraRuntimeError: No data recevied from sensor. Check all connections, including the SUNNY chip on the camera board

    Kontrolliere doch mal das Kabel von der Kamera zum Pi.

    Füge mal spaßeshalber in der

    Python
    def get_picture():
        logging.info("Nehme Bild auf")
        camera = PiCamera()
        with camera as cam:
            cam.rotation = 0
            cam.start_preview()
            sleep(1)
            cam.capture(Path(PATH_TO_IMAGE).with_suffix(IMAGE_FORMAT),
                        resize=(640, 480))

    beim Speicherort des Bildes:

    Python
    cam.capture(Path(PATH_TO_IMAGE).with_suffix(IMAGE_FORMAT),
                        resize=(640, 480))

    den Pfad ganz normal ein. Also so:

    Python
    cam.capture("/home/pi/foto.jpg", resize=(640, 480))


    Den Tracback bitte in einen Code_Block, wie beim Script. Ich will keine Datei herunterladen.

    luemar

    Kannst du jetzt mal das Script + den Änderungen in der Config aus #48 testen und danach gleich mal den Traceback posten? Ohne das du da was veränderst?

    Sonst kommen wir hier nicht weiter.


    Edit:

    luemar

    Und wenn ich Deinen Code #48 nochmals neu kopiere kommt:

    Python
    Traceback (most recent call last):
    File "/home/pi/onMotion_5.py", line 115, in <module>
    main()
    File "/home/pi/onMotion_5.py", line 96, in main
    lock = threading.Lock()
    NameError: name 'threading' is not defined

    Da stehts doch. Da war kein threading -Import im Script. Ist da jetzt eingefügt.


    Und bitte setz die Fehlermeldungen in ein Codeblock. Das ist sonst zu unübersichtlich.

    luemar

    Genau das meine ich.

    Du änderst was am Script, keiner weiß was und dann postest du die Fehlermeldung von der Änderung die du da getätigt hast. Da weiß doch keiner was in Wirklichkeit passiert.

    Einfach das Script nehmen komplett kopieren und testen. Wenn da ein Traceback kommt, diesen nehmen und posten und das am besten auch im Code-Block wie beim Script.

    Und dann kann man da auch was machen.

    Code
    NameError: name 'path' is not defined

    Da fehlen die "-Zeichen in den [] :

    Code
    PATH_TO_IMAGE = Path(config[path][image])

    das muss so aussehen:

    Code
    PATH_TO_IMAGE = Path(config["path"]["image"])


    Edit:

    Zu spät.

    Eigenartig, es gibt doch keinen dictionary Daten Typ im Code ??

    Naja, doch.

    Da ist Yaml bzw. die Config-Datei.

    Du hast da in der Config quasi einen Schlüssel und den dazugehörigen Wert, also Key/value-Paare.

    Zum Beispiel wäre ["path"] der Key und ["image_format"] der Wert zu "path". Das funktioniert dann eben nicht, wenn da ein Komma zwischen den Klammern steckt.


    Wie kommt denn das Komma dahin? Das musst du ja aktiv eingebaut haben.

    Am besten das Script einfach komplett übernehmen, testen und ggf. den Traceback posten. Sonst weiß nachher keiner mehr welches Script du da benutzt hast und warum da was nicht läuft.

    Du müsstest nochmal die config anpassen. Unter path: und image: sollte das .jpg aus dem Pfad raus und das .jpg extra erstellen und den rest der config kannst du so lassen.

    Sprich so:

    Code
    path:
        image: "/pfad/zum/image/dein_image"
        image_format: ".jpg"

    Und dann das hier.

    Ungetestet.

    Juah, dann nochmal so.

    Also ich finde das ja massiv schräg wo dieses `EmailMessage`-Objekt erstellt wird. Das ist doch total unübersichtlich das über das Programm verteilt zu befüllen und dann wieder zu leeren, statt da einfach bei Bedarf ein frisches neues zu erstellen.

    Wer lesen kann....und so. Dann gilt das doch auch für das Pushbullet-Objekt oder?


    Und wie kann man das mit den 2 Threads machen? Mit einer Queue oder einem Flag?

    Also ich finde das ja massiv schräg wo dieses `EmailMessage`-Objekt erstellt wird.

    Massiv schräg also. ^^

    Einfach nur, weil das Objekt in die Funktion sollte oder auch weil ich mir das durchschleifen in die jeweilige Funktion spare?

    Generelle Frage: Wo erstellt man denn am besten das Objekt oder Objekte?

    Wenn das mal gleichzeitig passiert — viel Spass.

    Besser dann 2 Funktionen, sprich task1() und task2() oder geht das eleganter/besser?

    Ich hab mich mit dem Thema noch etwas auseinander gesetzt und hab das mangels Hardware ohne Kamera und ohne Pushbullet nachgestellt. Auch, hab ich jetzt nicht am Pi geschrieben und habe den Pir per "mock" eingebaut.

    Zuerst war das Problem das der Header zur Mail mehrfach angelegt wurde und dadurch folgende Meldung kam:

    Python
    ValueError: There may be at most 1 Subject headers in a message

    Dann hab ich den Header in der main() 1x erstellt und diesen immer wieder, bei einer neuen Mail, aufgerufen, was dann lief. Allerdings war das Bild nach mehrfachen senden auch mehrfach im Anhang. Also 1. mal Mail senden - 1 Bild im Anhang, 2. mal senden - 2x das selbe Bilde im Anhang, 3. mal senden - 3x das selbe Bild im Anhang usw..

    In der Doku steht das man den Inhalt des Headers löschen kann. Da hätte ich mal eher reinschauen sollen. :stumm:

    python.org - email.message.EmailMessage.clear

    Wie dem auch sei, danach liefs so wie mans braucht.


    Das senden der Mail hab ich in einer Schleife einegbaut und auch was da den Aufruf zum senden der Mail war. Also ob der Pir oder schedule.

    Die Aufrufe musste ich Zeitlich pausieren da sonst wieder obige Fehlermeldung kam. Keine Ahnung warum und ich hatte jetzt auch keine Lust mehr danach zu suchen. Vllt kann mir das jemand beantworten, der tiefer in der Materie steckt.


    Hier das Testscript + Yaml.config:

    Code
    pip install loguru
    pip install pyyaml

    Beispiel Ausgabe:

    luemar

    Wäre schön, wenn du das folgende Script nochmal testen könntest. Das liegt nicht an schedule oder der paus(). Das liegt eher daran wie das mit der Mail bzw. Camera aufgebaut ist.

    Wenn dein jetziges Script schon als Service läuft, stop den Service bevor du das folgende Script testest. Wenn du mit strg-C das Script nicht anhalten kannst warte noch ein wenig, denn, wenn das Script gerade ein Bild aufnimmt oder die Mail sendet kann es noch kurz dauern bis das Script beendet wird oder du spamst die Konsole mit strg-C voll.


    Config:

    Den Pfad zur Config-Datei musst du im Script angeben. Einfach eine Text-Datei erstellen den Inhalt rein kopieren und in config.yml umbennen.

    Script:

    Teste das ganze am besten mit Thonny und nicht in der Console und übernimm das ganze Script und nicht nur Teile.

    In Zeile 27 muss der Pfad zur config Datei angepasst werden.

    Ungetestet. Ich hoffe ich hab nichts vergessen.

    Kann es sein das du nicht das gesamte Script übernimmst sondern nur Teile?

    Weil da einige Formatierungen nicht hin hauen. Ich bin auch erst Freitag wieder zu Hause, mich würde es schon interessieren warum das Script nicht funktioniert.

    Der Code den du in #27 gezeigt hast, ist nicht der aus #24.

    Der Code aus #27 hätte Fehler werfen müssen.

    Genauso auch der aus #24.


    Wie machst du das, wenn du den Code aus dem Forum testest? Ich glaube nämlich langsam das da was schief läuft, wenn du Code aus dem Forum kopierst.


    Wenn du sehen willst ob die Funktionen ausgeführt werden, kannst du auch in jeder Funktion ein Print ausgeben lassen und musst keine extra Funktion dafür schreiben oder du benutzt zum Beispiel logguru.

    Kannst du das mal durch nen debugger laufen lassen und schauen wo das Program hängt?

    Thonny hätte zum Beispiel einen debugger bei.


    Edit:

    Da war eine Einrückung falsch und in der send_email war ebenfalls was nicht richtig definiert.

    Auserdem hat da ein Import gefehlt, welches vorher drin war.

    Ungestestet.